Examples

2022-7-27 #19 ABC221H & uoj449,AGC038E,uoj514

呜呜呜,远溯太好听了啊啊啊啊😖。

052 ABC221H Count Multiset

给了我很深印象的一场 ABC。

差分,即计数“\(\leqslant x\) 的数有多少个”对应的序列,其形态即二维平面从 \((0,0)\)\((n,k)\) 的一条由上步、右步组成的折线,且满足面积为 \(n\),每一个极长上步段长度不超过 \(m\)

(注意,你如果将 \(x,y\) 设反是不好处理的,因为限制变为了每个极长右步段长度不超过 \(m\),此时你需要对问题转置😆)

发现倒数第 \(i\) 行高度不超过 \(\frac ni\),直接设计 dp 记录总面积,位置和当前高度,前缀和优化即可,复杂度 \(O(n^2\log n)\)

进一步,你发现当前位置是无关紧要的,只需记录高度,复杂度 \(O(n^2)\)

(所以这道题我是怎么说这么长的,有用的不就两个字“差分”吗)

#include<stdio.h>
const int maxn=5005,mod=998244353;
int n,m;
int f[maxn][maxn],sum[maxn][maxn];
int main(){
	scanf("%d%d",&n,&m);
	f[0][0]=1;
	for(int i=0;i<=n;i++)
		sum[0][i]=1;
	for(int i=1;i<=n;i++)
		for(int j=0;j<=n;j++){
			if(j<=i)
				f[i][j]=(sum[i-j][j]-(j-m-1<0? 0:sum[i-j][j-m-1])+mod)%mod;
			sum[i][j]=((j==0? 0:sum[i][j-1])+f[i][j])%mod;
		}
	for(int i=1;i<=n;i++)
		printf("%d\n",f[n][i]);
	return 0;
}

053 uoj#449. 【集训队作业2018】喂鸽子 / AGC038E Gachapon / uoj#514. 【UR #19】通用测评号

以前做的题都忘了,怎么救?

uoj449:

我们直接上 min-max 容斥,问题变为“\(c\) 只鸽子中有一只饱了的期望时间”。

枚举这个时间,先给饱的鸽子分配,然后

posted @ 2022-07-27 14:33  xiaoziyao  阅读(67)  评论(0编辑  收藏  举报