10.17 小记
先复活一天的小记
因为今天考模拟赛了....
Zpair 的模拟赛
T1
首先题意转化为最长的一段平均值大于等于 \(k\),然后就是转化成所有的数减掉 \(k\),求一个前缀和之后要求一段 \(sum_l\leq sum_r\)。
然后这个是 \(O(n)\) 的。
就是对于 \(r_1,r_2\),如果 \(sum_{r_1}\leq sum_{r_2}\) 且 \(r_1\leq r_2\) ,那么选 \(r_2\) 一定比 \(r_1\) 优。
我本来想说左端点然后直接说了个右端点但是都是一样的
所以我们对左端点维护一个单调递减的栈,越靠近栈顶的越小,同时下标越大。然后从右往左维护右端点,这样越往左就直接弹栈。
你说如果当前没有一个特别小的导致找到的不合法的怎么办?其实因为这种右边一定是有一个比它优的东西让他弹成这样的,所以没关系,不用管他。
top=1;st[1]=0;
for(int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+a[i]-K;
if(sum[st[top]]>sum[i]) st[++top]=i;
}
int ans=0;
for(int i=n;i;i--)
{
while(top&&sum[st[top]]<=sum[i]) top--;
ans=max(ans,i-st[top+1]);
}
printf("%d ",ans);
T2
- 人类智慧计数
- 半个身败名裂,
半个是因为当时没写,但是我听了
就是转化为求有多少种序列使得:
- 总和为 \(3m\)。
- 某一个数不超过 \(2m\)。
- 奇数个数不超过 \(m\)。
不管第二个条件,只管第三个。
枚举奇数个数为 \(i\),然后把所有奇数减一,剩下所有数的和为 \(3m-i\),这个数如果是奇数那一定不可能。
然后如果是偶数的话,整体除以 2,这样就变成了球盒问题。
然后就是要选 \(i\) 个整数,所以总和就是 \(C_{n}^{i}\times C_{p+n-1}^{n-1}\)。
然后要把不合法减掉,不合法的数最多只有一个,然后总和减掉 \(2m-1\),这样条件 3 就一定合法(最多就是 \(m-1\) 个奇数),所以不合法的就是 \(n\times C_{m+n-2}^{n-1}\)。
然后做差即可。
T3
数据范围像分块。
因为数值上各位互不影响,所以我们每 \(256\) 个分一块,然后一块内只有低位的 8 位是互相影响的,剩下的没有关系。
所以我们设 \(f_{i,j}\) 表示第 \(i\) 个数往上数 \(256\) 个数里,与高8位是 \(j\) 的数的异或最大值。
这个可以统一扔到 trie 里维护。
然后就是大块的时候用这个算答案,小块里直接暴力跑。
T4
其实是 dp 套 dp ,但是我做的时候没这么理解。
啊但是不用另外一个 dp 的状态打死都设不出来这个状态。
就是判断一个序列合法的方式就是 dp
\(dp_{i}\) 表示到第 \(i\) 个位置,能否可以删空
如果存在 \(dp_{j-1}=1\) 且 \(a_{j}=a_{i}\) ,那么 \(dp_{i}=1\)。
然后就是设另外一个状态 \(f_{i,j,0/1}\) 表示到第 \(i\) 个数,前面有 \(j\) 个不同的 \(a_{j}\) 值是 \(dp_{{j-1}}=1\) 的。
所以就是 \(f_{i,j,1}=f_{i-1,j,0}+f_{i-1,j,1}\) ,因为随便选一个已经在集合里的就行。
然后 \(f_{i,j,0}=f_{i-1,j-1,1}\times (m-j+1)+(m-j)\times f_{i-1,j,0}\)
答案就是 \(\sum f_{n,i,1}\)。
后记
本来回家之后挺累的啥都不想写‘。
但是撸了几分钟猫就复活了(?)
没有拍照。
多努力 多幸运 才能接近终点
不停息 不犹豫 能否抵达明天
也困难 也恐惧 前方万丈高悬
伤痕是否算纪念
——《夏花》
这首好好听

浙公网安备 33010602011771号