ABC221

ABC221

A

签到

B

签到

C

暴力枚举全排列

D

离散化,按右端点排序,差分

E

给定一个序列\(A\)

求满足第一个数不大于最后一个数的子序列的数量。

解:

权值线段树优化\(dp\),每次从\([1,a[i]]\)转移,每处理一个位置后把全局贡献乘二

F

给定一颗\(n\)个顶点的树,令\(D\)为树的直径的长度,求选择两个或多个顶点使得任意两个点之间的距离为\(D\)的方案数

解:

好题好题

考虑一个我没考虑过的模型:

将树的直径取出来,设端点为\(x,y\),长度为\(D\),考虑直径上每个节点挂的非直径上节点的子树的贡献

找到树的直径的中点所在边的端点\(pt_1,pt_2\)

当直径长度\(D\)为奇数:

假设在\(pt_1\)子树内任取一点\(v\),则有

\[dis(v,pt_1)+dis(pt_1,pt_2)+dis(pt _2,y)\leq D \]

其中有\(dis(pt_1,pt_2)=1,dis(pt_2,y)=\frac{D-1}{2}\)

所以\(dis(v,pt_1)\leq \frac{D-1}{2}\)

那么设\(pt_1\)子树内另一点为\(u\),则有\(dis(v,u)\leq dis(v,pt_1)+dis(u,pt_1)\leq D\)

所以答案的两个节点一定不会在同一颗子树里

所以答案就是

\[ans=(\sum_{v\in pt_1}[dis(v,pt_1)=\frac{D-1}{2}])*(\sum_{u\in pt_2}[dis(u,pt_2)=\frac{D-1}{2}]) \]

当直径长度\(D\)为偶数:

那么直径的中点一定落在某个节点上

对这个节点的所有子树,有

\[ans_1=\prod(\sum[dis(u,pt)=\frac{D}{2}]+1) \]

再用容斥减去不满足要求的:只选一个点或者不选点的情况

\[ans_2=\sum[dis(u,pt)=\frac{D}{2}]+1\\ ans=ans_1-ans_2 \]

G

你在二维平面上的\((0,0)\)处,第\(i\)步可以选择横坐标或纵坐标加或减\(D_i\)\(m\)步后是否有可能在\((A,B)\)

解:

也是好题

一个\(trick\):把坐标轴旋转\(45°\),然后伸长为\(\sqrt{2}\)倍,目标坐标\((A,B)\)变为\((A+B,A-B)\)

此时每一步的横纵坐标变化都是独立的

我们要令\(s_1\sim s_n\)\(1\)\(-1\),使得

\[\sum_{i=1}^{n}s_iD_i=A+B\\ \sum_{i=1}^{n}s'_iD_i=A-B \]

\(S=\sum_{i=1}^nD_i\)

然后是\(01\)背包转化的一个\(trick\):将一堆物品分为两部分,使得两部分之差是\(k\)

原问题等价于令\(t_1\sim t_n\)\(1\)\(0\),使得

\[\sum_{i=1}^n t_iD_i=\frac{S+A+B}{2}\\ \sum_{i=1}^n t'_iD_i=\frac{S+A-B}{2} \]

如果右侧不是偶数,小于零或大于\(S\),,将无解

否则可以用\(bitset\)优化\(DP\)

H

给定\(n,m\),求集合总和为\(n\),每个数字最多出现\(m\)次的多重集的个数

假设集合中的数从小到大排序

对于一个递增数列,常用套路是转化为差分序列来变成任意序列

对于集合\(A=(A_1,A_2,…,A_k)\),其中\(A_i\leq A_{i+1}\)

设有\(B=(B_1,B_2,…,B_k)\),其中\(B_i=A_i-A_{i-1}\)

那么一个满足要求的\(A\)序列对应的\(B\)序列应该满足以下要求:

\((1)\)\(B_1>0\)

\((2)\)\(\sum_{i=1}^kB_i(k-i+1)=N\)

\((3)\)不存在连续\(M\)或更多个\(0\)

如果我们将\(B\)翻转得到\(B'\),那么条件变为

\((1)\)\(B_k>0\)

\((2)\)\(\sum_{i=1}^kiB_i=N\)

\((3)\)不存在连续\(M\)或更多个\(0\)

此时考虑\(DP\)

\(f[x][y]\)\(k=x\),和为\(y\)的方案数

枚举前一个不为\(0\)的位置\(t\),枚举\(B_i\)

\[f[x][y]=\sum_{t=x-M+1}^{x-1}\sum_{B_i=1}f[t][y-i*B_i] \]

考虑到\(f[t]\)可以前缀和优化,复杂度优化到\(O(n^2logn)\)

\[f[x][y]=\sum_{B_i=1}(s[x-1][y-i*B_i]-s[x-M][y-i*B_i]) \]

但其实不用枚举\(B_i\),因为\(f[x][y]\)\(y\)维本身就是一个关于\(i*k\)的前缀和

\[f[x][y]=s[x-1][y-i]-s[x-M][y-i]+f[x][y-i] \]

posted @ 2021-11-04 21:16  lovelyred  阅读(58)  评论(0)    收藏  举报