写在前面的话:暴力yyds!
T1
期盼:100 实际:100
题如其名,属实是签到题了。直接暴力,因为题目说拿走两个相同的数x后会放入数x+1,所以我一下子想到了二进制,把\(a_i\)个i当成在第i位上有\(a_i\)个1。把问题转化一下,我们需要求的实际上是可以进位多少次。直接对每个\(a_i\)进行累加,把进位的值加入后一位。需要注意的是n次操作后不一定进位完,还要继续算。时间复杂度\(O(n)\)
考场上这种题属于必拿分,做完之后要检查,一定不能失分。
T2
期盼:100 实际:100
考场上我一开始是打的暴力,打完之后大样例只跑了0.3s,就估算了一下时间复杂度发现应该能过,总之真的过了还是比较意外的。
看到这道题的第一眼,我就想到了昨天我幸幸苦苦打的线段树二分。而昨天为了正确的打出线段树二分看了很多资料,因此发现线段树二分太有用了,甚至可以用无序数组查找+单点修改。于是我在打线段树时加入了一点二分的思想来优化,就成功的过了。
本题方法有很多分块/线段树都可以过,但思想都是一样的,个人认为线段树更优,因为分块要用stl,而stl众所周知跑的很慢。对于操作1,直接线段树单点修改;而对于操作2就有些难度了,我们维护线段树子区间的最大值,对于最大值小于要取余的数k的子树直接跳过,所以我们只对单点值大于k的数取余;对于操作3,我们直接区间维护最大值就好了。
方法:线段树单点修改+区间查询
关于复杂度:对于一个数\(a\)我们最多取余\(loga\)次,这个数就会变为1或0。所以时间复杂度为\(O(nlognloga)\)
T3
期盼:10 实际:10
一道数学题,\(O(n)\)预处理+\(O(1)\)的输出.
谢邀,希望以后出题人少点数学,多点良心。遇上数学题我基本就只能拿暴力分,而像今天这种卡的比较严的,推出公式100分是没问题的,但我基本上推不出公式,只有暴力的10分,分差还是比较大。不过说实话就算我考场上记得错排公式,我也无法分类讨论后得到正确的公式。
题目明确的告诉我们这道题和错排有关,而错排的公式为\(D(n)=(n-1)(D(n-1)+D(n-2))\),特别的\(D_{1}=0,D_{2}=1\)。
我们分三种情况来讨论:
- i,j,\(a_i,a_j\)互不相同,因为交换一定可以产生贡献。总共:\(\frac{d_{n-2}}{2}*\frac{n*(n-1)}{2}\)
- \(a_i=i,a_j=j\)显然交换后可以产生贡献。总共:\(\frac{d_{n}}{2}*\frac{n*(n-1)}{2}\)
- \(a_i=j,a_j!=i\)这种情况要么直接是逆序对;要么如视频里讲的那样,一通交换形成逆序对(\(a_i=a_j,a_j=i\)),因为涉及三个数,总贡献为:\(\frac{n*(n-1)*(n-2)}{3}*\frac{d_{n-1}}{2}*\frac{1}{n-2}\)
把以上三种情况加起来的总贡献,即为答案。(注意:当n为2时需要特判)
T4
期盼:35 实际:45
说吧,出题人你还有没有良心。
一道诈骗题,要不是不会写我就用字符串黑科技,成功被出题人给骗了。考场上直接打的暴力程序,总结下来几个优点:多、快、好写,时间复杂度\(O(n^2)\)~\(O(n^3)\),直接爆掉,目标就是拿部分分。
万万没想到要用bitset。先预处理把所有的点存入bitset,如果这个点出现了,就把bitset[s[i]]的第i位赋值为1。
对于修改操作直接\(O(1)\)暴力修改;对于查询操作,我们把字符串t的第i位的bitset>>i与存答案的res进行and操作,最终res中区间[l,r]中1的个数,即为答案。