10.17 小记

先复活一天的小记

因为今天考模拟赛了....

Zpair 的模拟赛

T1

[POI2010]KLO-Blocks

首先题意转化为最长的一段平均值大于等于 \(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

[AGC036C] GP 2

  1. 人类智慧计数
  2. 半个身败名裂,半个是因为当时没写,但是我听了

就是转化为求有多少种序列使得:

  1. 总和为 \(3m\)
  2. 某一个数不超过 \(2m\)
  3. 奇数个数不超过 \(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

CF840E In a Trap

数据范围像分块。

因为数值上各位互不影响,所以我们每 \(256\) 个分一块,然后一块内只有低位的 8 位是互相影响的,剩下的没有关系。

所以我们设 \(f_{i,j}\) 表示第 \(i\) 个数往上数 \(256\) 个数里,与高8位是 \(j\) 的数的异或最大值。

这个可以统一扔到 trie 里维护。

然后就是大块的时候用这个算答案,小块里直接暴力跑。

T4

[PA 2021] Od deski do deski

其实是 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}\)

后记

本来回家之后挺累的啥都不想写‘。

但是撸了几分钟猫就复活了(?)

没有拍照。

多努力 多幸运 才能接近终点

不停息 不犹豫 能否抵达明天

也困难 也恐惧 前方万丈高悬

伤痕是否算纪念

——《夏花》

这首好好听

posted @ 2022-10-17 23:21  cc0000  阅读(42)  评论(0)    收藏  举报