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(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\)
所以答案的两个节点一定不会在同一颗子树里
所以答案就是
当直径长度\(D\)为偶数:
那么直径的中点一定落在某个节点上
对这个节点的所有子树,有
再用容斥减去不满足要求的:只选一个点或者不选点的情况
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\),使得
设\(S=\sum_{i=1}^nD_i\)
然后是\(01\)背包转化的一个\(trick\):将一堆物品分为两部分,使得两部分之差是\(k\)
原问题等价于令\(t_1\sim t_n\)为\(1\)或\(0\),使得
如果右侧不是偶数,小于零或大于\(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[t]\)可以前缀和优化,复杂度优化到\(O(n^2logn)\)
但其实不用枚举\(B_i\),因为\(f[x][y]\)的\(y\)维本身就是一个关于\(i*k\)的前缀和