2026/10/14衡中集训
专题-模拟与枚举1
AtCoder - abc459c(F题)
这个题直接按题面描述的去模拟的话很容易超时,所以要优化
可以设一个偏移量delta,如果这一层满了的话delta就+1,相当于把这一层减去了
具体操作:
if (op==1)
{
val[x]++;//x盒子的值+1
cnt[val[x]]++;//当前值的盒子数+1
if (cnt[delta+1]==n) delta++;//如果该层已满,就将偏移量+1
//实际的层级其实是delta+1,如果满了delta++相当于把delta+1层删除
//cnt可以用于输出>=目标的数,因为里面的值不会改变,会一直存着>=当前值的盒子数,改变的是偏移量
}
else cout << cnt[delta+x] << endl;//最后的答案就是目标层级+偏移量
CodeForces - 2231C(G题)
初步的想法是先对每个数跑一遍,然后记录遇到的最小的偶数,最后计算所有数到那个偶数的步骤
然而不对,因为对于1 1 3来说,1是最优的,仅需3步,2不是最优的,需要4步
考虑换个做法,可以用map记录跑一遍后数出现的个数和总步骤,最后计算最小值就行,数字个数是\(O(nlogn)\)级别的
但是本题时限很神秘,用两个map过不了,需要用unordered_map<int, pair<int, int>>才能过>.<`因为这个吃了三发罚时
CodeForces - 2249A(H题)
思路想复杂了,这个数据范围完全可以暴力
枚举m的长度,暴力枚举每个lruv,并记录cnt为当前数位与选择点的个数,判断能不能选,如果能选就cnt++, 如果选择后的点>m,就表示在选择的时候有解,就用一个ans保存m的最大值,答案即为ans
反思:如果cnt即表示数位与个数,那么在最后cnt需要-1,因为选择时cnt(数位)是不断+1的,而最后选择时又+1,所以最后计算点个数时要再-1,因为没考虑到这个吃了一发罚时qwq
多练,熟能生巧
CodeForces - 2202B(I题)
又想复杂了...一开始的想法是设两个数l,r表示目前左右端点的状态,随后对于每个字符判一下目前的状态,有?就判断接下来的状态进行更改
但是有多个?的情况就不行了,因为有多种可能的方法可能会影响后面,所以这个写法还是不太对
看了看题解才知道有个很简单的思路,因为原先字符串是abab交替的,所以:
对于奇数情况,去掉第一个a,变成baba...a,会发现不管怎么取都只能交替着取
对于偶数情况,原先的字符串就是abab...b,会发现也不管怎么取都只能交替着取
所以对于奇数情况,i从1开始,偶数就从0开始,判断s[i]于s[i+1]是否相同,如果相同就是NO,i+=2
?的情况实际上也可以放与后面不相同或者在取字符时不会无解的字母,所以就可以不考虑了
注意有可能有两个?的情况,判断时要特判一下
专题-差分、前缀和1
AtCoder - abc177_c(A题)
题面:给定n个数,让我们求\(\sum^{N-1}_{i=1}\sum^{N}_{j=i+1}A_iA_j\)
初步思路:这个题可以用乘法的前缀和吧,算一下然后枚举i, j,输出前缀和%1e9+7累加就行
但是后来发现\(N\leq2\times10^5\),\(O(n^2)\)明显会超时,所以考虑优化一下
观察原式,可以发现能改成这样的形式:\(\sum^{N-1}_{i=1}A_i\times(A_{i+1}+A_{i+2}+\cdots+A_n)\),所以可以枚举i,用前缀和计算\(A_{i+1}+A_{i+2}+\cdots+A_n\),最后与\(A_i\)相乘并累加即可
反思:还是没有第一时间想出正解,数学的思维题还需要多练

浙公网安备 33010602011771号