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\) 只鸽子中有一只饱了的期望时间”。
枚举这个时间,先给饱的鸽子分配,然后