2024.4 总结 2 / 圣殿之国 迎来世界的终结之末

P6240

分治背包即可,在分治区间 \([s,e]\) 中处理跨越 \(mid\) 的询问,具体而言处理 \(mid\) 左边的后缀背包, \(mid\) 右边的前缀背包,查询的时候合并对应的前后缀背包即可。复杂度 \(O(n\log n k+km+m\log n)\),背包合并用 \(O(k)\) 的。


P6105

显然处理 \(x\gets x\mod c\),然后就是分讨,首先有一个 \(\max-\max_2-c\) 的贡献,然后我们讨论 \(i+j<c\) 的最大值的贡献。

对于相同的数,我们单独处理,剩下的数两两不同。

比较显著的,我们会考虑对于每一个 \(x\) 维护一个 \(lnk_x\) 表示 \(x+i\) 的最大值,然后发现一个修改可能会导致 \(O(n)\),非常的傻逼。

然后发现双向倾诉的边才是有用的,事实上我们只需要维护 \(lnk_x=y,lnk_y=x\) 的贡献,这样子复杂度就对了,然后就要写一大堆的 stl。

然后你妈的 RE。然后你妈的 RE。然后你妈的 RE。呜呜。呜呜。呜呜。

然后他妈的 TLE。然后他妈的 TLE。然后他妈的 TLE。呜呜。呜呜。呜呜。

map 常数这么大?map 常数这么大?map 常数这么大?呜呜。呜呜。呜呜。


CF1209F

首先这个最短路存不下来,那么肯定是按照某种办法顺序搜索就可以保证顺序了。

考虑到最大的影响是数的位数,为了能直接 bfs,不难想到边拆点,这样子全部边权为个位数,然后就可以保证位数正确了。

然后就会发现只要按照搜索拓展的时候把边权按照 小 到 大 考虑,其实就是对的了?

然后发现 WA,因为对于 \(dis\) 一样的点,更新的先后顺序会有影响,并且这个顺序不太能通过 priotity 之类的东西做掉,不然会变成不能保证权的不完全版本的普通最短路或者其它更离谱的错误算法,原因是可能会出现交叉,即在 \(dis_x=dis_y\) 时,同时需要 \(x\to a\)\(y\to b\),那么为了保证最短就不能保证顺序,为了保证顺序就不能保证最短。所以只能将 \(dis\) 相等的打包一起更新,使用 queue<vector<int>> 谢谢。


CF1004E

首先不难想到直径的中点必选,然后有一个小贪心,如果只多选一个点,应该是当前选择链两端中 dis 最大的,这个贪心又显然是错误的。

但是按照那个链一直拓展显然会变成直径,然后我们发现链条不在直径上不优,于是可以在直径上面做滑动窗口。


CF986C

不难发现 \(A\)\(¬A\) 的子集可以连边,不难想到高维前缀。

按照高维前缀和的做法,不妨对于 \(i\in [0,2^n-1]\),把 \(i\) 向比 \(i\) 只少一位的 \(j\) 连边,这样子成 DAG,然后原题的一个 \(a_i\) 就是跟 \(¬a_i\) 的子树里面的所有点连边。

然后发现相同子树只需要做一次就并成最多一个了,所以可以直接做了,做到做过的直接合并进去,那么一个点搜到一次,复杂度就对了。


AT_arc146_e

一眼从小到大做,记录上一位留了几个空,然后发现空的约束很重,每一个 \(i\) 的空数直接被后面钦定了,状态数不是很多,这样就可以直接做了捏。学习 Sunny郭 的优美 dfs 写法,很短很清晰,设 \(f[k][s][p]\) 表示做到第 \(k\) 位,有 \(s\) 个空可以填,两边有 \(p\) 个没填掉,那么转移如下,边界 \(f[k(k>n)][s][]=[s==0]\) >w<

\[f[k][s][p]\gets f[k+1][a_k-s-2][2]\times \binom{a_k-1}{s+1} \]

\[f[k][s][p]\gets f[k+1][a_k-s-1][1]\times \binom{a_k-1}{s}\times p \]

\[f[k][s][p]\gets f[k+1][a_k-s][0]\times \binom{a_k-1}{s-1} \]


AT_arc152_d

边数 \(\frac{n-1}{2}\),无解就是 \(2|n\) 嘛 >_<

不难发现连边 \(i\to (i+k)\mod n\) 之后会成环,如果只有一个环,那显然把环按顺序摆出来,之后问题等价于 \(k=1\) 的情况,随便钦定即可,比如 \(ABCDE/EABCD\) 可以选 \(BC+DE\) 捏。

然后平凡的说,应该有 \(d=\gcd(n,k)\) 个环,我们第 \(i\) 个环放在第 \(i\) 行,这样给 \((x_1,y_1) (x_2,y_2)\) 连边也会给 \((x_1,y_1+1),(x_2,y_2+1)\) 连边,不妨按照
此图方式构造。


P2617

整体二分即可。


P1527

整体二分即可,需要一个二维树状数组。


CF980D

不难发现除了带 \(0\) 的情况,\(ab\) 是平方数当且仅当对于任何质数 \(p\),其在 \(a,b\) 中的指数的奇偶性相同,于是不难想到对于所有 \(a_i\) 去除其平方因子,如果区间没有 \(0\),这样区间 \(l,r\) 的答案就是其中数值的种类数。

区间 \(l,r\) 我们可以考虑枚举,然后计数使用 unordered_map 会 tle,所以直接离散化加桶就行了。然后要对于 \(0\) 做一个小分讨,假设数值种类数为 \(jury\)

  • \(r-l+1=cnt_0\) 时,贡献给 \(ans_1\)

  • \(cnt_0>0,r-l+1<cnt_0\) 时,贡献给 \(ans_{jury-1}\)

  • \(cnt_0=0\) 时,贡献给 \(ans_{jury}\)

做完了。


P3332

整体二分板子题。


4602

对于美味度,使用二分答案,现在考虑只选择美味值 \(\geq mid\) 的饮料能不能做到选 \(L\) 的体积价格不超过 \(P\) 啦。

显然是一个小贪心,按照 \(p_i\uparrow\) 排序,选择前 \(L\) 的体积算和即可,显然可以在线段树上二分,因为 \(mid\) 的变化写主席树即可。


AT_abc193_f

很网络流的样子,考虑最小割,非黑即白 / 相邻 有两种二分图的方式,玩一下感觉第二种不太会其实,所以考虑用 \(S\to L(i,j):inf / R(i,j)\to T:inf\) 表示选择黑 / 白, 表示不能割,\(L(i,j)\to R(i,j):inf\) 表示二选一。注意此类连边初始流量要给多倍 \(inf\) 捏。

然后这个不同有贡献,最小割,发现答案是最大值,不难想到一个转换:将 \(2|i+j\)\((i,j)\) 取反,这样子变成相邻相同有贡献,然后要最小化不同颜色的相邻,具体的连边就是对于 \((i,j),(x,y)\) 相邻,连接 \(L(i,j),R(x,y)\),边权为 \(1\) 即可,表示异色贡献。


ABC137F

有一种显然的做法,拉插然后背包算系数,复杂度 \(O(n^3)\),观察到 \(p\) 数量不多,打表可能可以通过此题 /yiw

考虑按照 CRT 的思想,对于每一位 \(a_i=1\) 构造出 \(g(x)=0/1\pmod p:x=i/x\neq i\) 算和即可。这个让我们想到费马小定理,\(a^{p-1}\equiv 1\pmod p\),在 \(a=0\) 时有例外,于是不妨构造 \(g(x)=1-(x-i)^{p-1}\),那么就做完了 qwq

\[Ans=\sum_{i=0}^{p-1}[a_i=1](1-(x-i)^{p-1})=\sum_{i=0}^{p-1}[a_i=1](1-\sum_{j=0}^{p=1}\binom{p-1}{j}x^j(-i)^{p-1-j}) \]


AT_abc278_g

初始化隐晦错误调了好久 /fad

可以考虑对称游戏,要求我们先手占用中间,之后评测姬选那一段我们选对应的一段即可。

但是对于 \(l=r\)\(l,n\) 奇偶性不同时,会导致不能占用中间部分,我们考虑 Nim,SG 状物,首先可选区间长度被钦定为 \(l\),对于整段的 \(SG_{len}=mex_{i=0}^{len-l}\{SG[i]⊕SG[len-i-l]\}\),对于很多段就是对应的 SG 异或和。

如果 \(SG[n]=0\) 就后手,否则先手。每一次找一个段,切完之后总的 SG 值为 \(0\),设当前 SG 为 \(tot\),就是找合法长度为 \(l\) 的被包含在 \([L,R]\) 里面的全没选区间 \((x,y)\) 满足 \(tot⊕SG[R-L+1]⊕SG[s-L]⊕SG[R-e]=0\),删去即可,复杂度 \(O(n^2)\) 捏。


ARC073E

如果对于任意 \(a_i=b_i\),顺次加入即可,然后这类东西没有 \(a_i=b_i\) 的前提强度已经不低了,个人感觉是在 \(1/6\uparrow\),打表之后发现确实是诶 >_

于是随机化可过,random_surffle 一个排列,按照排列顺序贪心加入即可。


P5633

wqs 二分板子题,因为要求钦定 \(k\),所以注意不合法的需要特判捏。


ARC073F

朴素的想法是 \(f[i][j]\) 表示人分别在 \(x_i,x_j\) 的最小代价,然后发现每一轮只有 \(f[i][],f[][i]\) 有用,然后相对顺序不重要,于是我们可以设计状态 \(f[i][j]\) 表示第 \(i\) 轮时候,一个人在 \(x_i\),另一个人在 \(j\) 的最小代价,第二维不是 \(x_j\) 是因为没必要置换,考虑转移:

  • 移动在 \(x_i\) 上那个人:\(f[i][j]+|x_i-x_{i+1}|\to f[i+1][j]\)

  • 移动不在 \(x_i\) 上那个人:\(\min\{f[i][j]+|j-x_{i+1}|\}\to f[i+1][x_i]\)

前面那种是区间加,后面那种是区间 rmq 和单点修改,写一个单点修,区间加,区间查的线段树优化 dp 即可,具体而言,在线段树上面维护 \(f[][i]-i/f[][i]+i\)


ABC306G

首先肯定要一直走包含 \(1\) 的环,然后可以发现是 \(1\) 的强联通分量里面的环任意加起来得到 \(10^{inf}\),因为裴蜀定理,我们考虑求出环长的 \(\gcd\{len_c\}=d\),判断是否有 \(d|10^{inf}\)\(inf\) 够大不用考虑负数,随便加加就正了......?具体而言,有构造形如 \(ax+by=c\),其中 \(a,b,c,x>0\) 但是 \(y<0\),可以通过 \((x-b)a+(y+a)b=c\) 的方式不断调整使得所有的系数非负。

那这个 \(d\) 因为是环,所以大概是要考虑生成树之类的东西了,考虑到环必须在 \(1\) 的强联通分量里面,先跑一次强联通忽略其它点。

本题无向图搞环那就 dfs 树呗,那好像只能算一个 \(u\to v\)\(|dep[u]-dep[v]+1|\) 这样的东西了,那 \(d\) 就取这个的 \(\gcd\) 即可喵。

\(\gcd\) 这种东西有一个 九章算术·更相减损术,意思是满足环可加减,那么这样做就对了嘛,大概是类似 最大 xor 路径 那个题目那样所有的表示已经完全了 qwq


ARC068E

有一个很显然的做法,枚举当前长度 \(d\) 再暴力位置复杂度只带 \(\log\),然后变的贡献有两种,\(len\geq d\),肯定贡献 \(1\)\(len<d\),可能贡献 \(1\),先对区间长度排序,这部分不会跨越直接数据结构平凡维护就行了 >w<

看眼题解,发现还有一种数论分块的做法,考虑 \([l,r]\)\(d\) 的贡献,那么就有:

\[l\leq xd\leq r\Leftrightarrow\lceil \frac{l}{d} \rceil \leq x \leq \lfloor \frac{r}{d} \rfloor\Leftrightarrow\lfloor \frac{l-1}{d}\rfloor<x\leq \lfloor \frac{r}{d}\rfloor\Leftrightarrow\lfloor \frac{l-1}{d}\rfloor< \lfloor \frac{r}{d}\rfloor \]

整除分块然后差分维护即可,非常好做法(((


CF1111E

考虑普通 dp,考虑到 \(i,j\) 不能同组,那么 \(i \in rt\to j\) 或者 \(j\in rt\to i\),不妨按照 dfs 序 dp,设计 \(f[i][j]\) 表示做到 \(dfn_i\) 分了 \(j\) 组的方案数,考虑转移,下面 \(len_i\) 表示 \(i\) 的祖先中需要分组的节点数量 >_<

\[f[i][j]=\max(j-len_{dfn_i},0)\times f[i-1][j]+f[i-1][j-1] \]

直接重新建出虚树,按照普通的树形 dp 即可。


ABC340G

考虑虚树 dp,对于每种颜色分别处理,然后考虑普通 dp 怎么做。

\(f[i]\) 表示以 \(i\) 为跟,叶子全都是合法点的方案数,那么 \(f[i]=\prod_{j\in Son_x}(f[j]+1)-[a_i\neq c]\),再考虑点 \(i\) 对全局的贡献,\(f[i]-[a_i\neq c]\sum_{j\in Son_x}f[j]\),然后做完了。


P4767/P6246

建议一个降蓝一个降紫 /fad

先随便套一个 wqs 二分,然后就是普通决策单调性优化,写一个二分队列即可 qwq

转移的区间是一个 \(l,r\) 走到一个点的最小代价,贪心可做。


ARC101E

鉴于给 Nefertari 详细讲解了,于是不再赘述。

考虑容斥,设钦定不选边集 \(S\) 的方案数为 \(F(S)\),那么答案就是 \(Ans=\sum(-1)^{|S|}F(S)\)

考虑一个大小为 \(n\) 的集合任意连边匹配的方案数 \(d(n)\),如果 \(n\) 是奇数,那么 \(d(i)=0\),不然选择一个编号最小的,再任意拿一个跟其匹配,然后就是子问题了,那么有 \(d(i)=(i-1)d(i-2)\),边界 \(d(0)=0\)

对于一个已知的边集 \(S\) 怎么求解 \(F(S)\) 呢?钦定边把图分成了若干联通块,联通块大小分别为 \(p_1,...,p_n\),根据乘法原理,\(F(S)=\prod_{i=1}^{n}d(p_i)\)。我们要放进 \(Ans\) 里面算贡献,那么就是 \(Ans=\sum(-1)^{n-1}\prod_{i=1}^{n}d(p_i)\),转换得到 \(-Ans=\sum\prod_{i=1}^n-d(p_i)\),这样的好处是不用额外讨论长度的奇偶了,然后我们 dp 求这个 \(-Ans\)

树形 dp 的顺序去考虑,\(\prod_{i=1}^n-d(p_i)\) 状物在当前点 \(i\) 上面挂了一大堆,不妨设 \(f[i][j]\) 表示 \(i\) 这个子树,\(i\) 所在的联通块大小为 \(j\)\(\sum\prod_{i=1}^n-d(p_i)\),特别的,\(i\) 这个联通块的 \(p_{\delta}\) 暂时没有被算进去。

考虑转移,有普通的计数原理,以及新确立一个联通块的 \(-d(p_i)\) 的乘法贡献,这个乘法贡献直接对所有的乘就行了,我们把 \(x\) 的孩子 \(y\) 合并进 \(x\),枚举 \(x,y\) 所在联通块大小,有:

  • 直接合并 \(x,y\) 所在的联通块,\(f'[x][i+j]\gets f[x][i]\times f[y][j]\)

  • \((x,y)\) 成为钦定边:\(f'[x][i]\gets f[x][i]\times f[y][j]\times -d(j)\)

答案的话显然是 \(-Ans=\sum f[1][i]\times -d(i)\),做完啦 qwq


P5574

我们考虑 \(g_i\) 表示当前情况下做到 \(i\) 这个前缀的最小代价,然后我们可以多分出一个段,\(f_i\) 表示多分一个段之后的最优代价,我们每一轮把 \(f\)\(g\) 转移,再 \(g\gets f\),这样子做 \(k\) 轮即可得到答案,考虑转移:

\[f_i=\min\{g_{j-1}+val(j,i)\} \]

柿子有决策单调性,分治转移即可。\(val(i,j)\) 表示区间 \([i,j]\) 的顺序对个数,这个东西莫队状物+树状数组维护,可以发现端点移动有限,查询均摊复杂度只有 \(O(\log n) 一次\),总的复杂度是 \(O(n\log^2n)\)


CF321E

普通决策单调性,跟上面那一个题目差不多,转移代价用二维前缀和计算即可。


P4383

不难发现联通块直径拼接最优,转换题意,用 \(k\) 条边将树切割成 \(k+1\) 个联通块,然后将联通块的直径用 \(0\) 边连接,最大和是多少,意思是求原树 \(k+1\) 条链的最大链和喵,注意这里的链的不交性比普通的更强。

这个 \(k\) 的选择可以使用 wqs 二分优化掉,然后就变成了选择带权 \(\Delta\) 的最大链和,考虑树形 dp,设 \(f[x][0/1/2]\) 表示在 \(x\) 子树,最后一条链跟 \(x\) 的关系为 不交/为端点/为中间点 时的最好价值,考虑转移,\(\gets\) 表示一个取 \(\max\) 的贡献:

初始化 \(f[x][0]=f[x][1]=f[x][2]= 0\)\(f[x][2]\gets \Delta\)

不连接新链,普通的拼接:\(f[x][2]\gets f[x][2]+f[y][0]\)

连接合成一条新链:\(f[x][2]\gets f[x][1]+f[y][1]+w(x,y)+\Delta\)

不连接新链,普通的拼接:\(f[x][1]\gets f[x][1]+f[y][0]\)

继承拓展一条 \(y\) 的链:\(f[x][1]\gets f[x][0]+f[y][1]+w(x,y)\)

不连接新链,普通的拼接:\(f[x][0]\gets f[x][0]+f[y][0]\)

清算结束一条链:\(f[x][0]\gets f[x][1]+\Delta\)

清算结束一条链:\(f[x][0]\gets f[x][2]\)

做的时候顺便记录一下次数,注意顺序位置不能错啊,wqs 注意边界问题,然后就做完了。


P5283

一对 \(x<y\) 只贡献一个 \(a_x\oplus a_y\),为了去掉这个偏序,我们考虑倍增 \(k\) 去直接做,然后最后 \(Ans\gets \frac{1}{2}Ans\) 啦。

不妨做前缀异或和,这样区间 xor 转化到单点,注意包括 \(s_0\),考虑到 \(a_x\oplus a_x=0\),任意取没有贡献,所以不需要数据结构上面做额外的操作。

那么直接把所有的 \(s_x\) 扔进 trie,支持一个查询 \(\oplus x\) 的第 \(rk\) 大的操作。考虑做一个堆,加入所有的「 点 \(i\) 的异或第 \(1\) 名大小为 \(val\) 」,每次取出一个 \(val\) 最大的加入答案,然后删除,并加入 「 点 \(i\) 的异或第 \(x+1\) 名大小为 \(val'\) 」 进入堆。


P5069

考虑一个数 \(a_x\) 被选择,做出 \(a_{x-1}\gets a_{x-1}-1,a_x\gets a_x-1,a_{x+1}\gets a_{x+1}-1\),那么 \(a_{x-1},a_x,a_{x+1}\) 相对大小不变,换句话说,如果一个数 \(a_x\) 被选择了,那么肯定会在 \(a_x\) 这个位置做 \(a_x\) 次。

题目给的操作有一个「多个相同选择编号最小」,那么不难知道选择是固定的,我们考虑维护这个选择序列,顺便计算出和。

我们分析选择序列的性质:不存在相邻两个都选,不存在连续三个不选,边缘前两个必须选一个。

单点修改不妨使用线段树维护,因为有必须选的约束,我们维护考虑不存在相邻两个不选,其它的边界发现直接合并没问题。

如果左区间的右端点和右区间的左端点没有都被选择,那么直接拼接即可。否则,我们需要根据 \(a[mid]\geq a[mid+1]\) 的成立性来钦定的选择,小的那一边钦定靠近中间的端点不存在,然后合并。

所以我们可以维护 \(v[p][0/1/2/3]\) 表示在点 \(p\) 的区间,完整区间/去掉左端点/去掉右端点/去掉两个端点 时的代价,顺便要记录一下每种情况左右端点有没有被选择,合并要写一个大分讨,别的就是线段树简单板子 >w<


CF875F

难得有趣。第一眼是一个费用流板子,但是这个数据范围过不了吧,于是考虑点其它做法。

对于一个公主,我们将其当成一条边 \((u,v):w\),建两个单向边,然后选一条单向边 \((u,v,w)\) 就表示 \(u\) 嫁给了这条公主,然后题目就转换成了求一个最大权基环树森林(每个点只能有一个出度),但是要求正反两条边不能同时选。

因为这个两条边一起选的限制,我们不妨将正反两条边一起考虑嘛,那就变成了维护一个无向基环树森林,然后就可以写一个 kruskal 状物,从小到大考虑边,能加则加,正确性与普通最小生成树类似。

考虑并查集怎么合并 \(x,y\):如果 \(x,y\) 在一个集合里面,如果集合是树,那么会变成基环树,如果集合是基环树,不能合并。如果 \(x,y\) 不在一个集合里面,如果是两棵树,会合并成树,如果是一棵基环树一棵树,那么会合并成基环树,如果是两个基环树,那么不能合并。


CF575G

弱化的不用拆点的 CF1209F,图反向考虑就是一个题面了。注意有前导 \(0\),需要只考虑 \(0\) 做一次 bfs 然后把能到达的点打包放进初始队列。


CF225D

直接广搜暴搜,发现 tle,那么记录每一个点进入次数不超过 10 就过了,跑的飞快,直接 luogu 最优解。我甚至是 string 记状态 unordered_map 去重。。。


CF626F

先转换题意,把 \(n\) 个点分成若干组线段,问线段长度和 \(\leq m\) 的方案数。

这种题一般的状态很难转移,考虑基于值域的 dp,先 \(a\uparrow\),然后设 \(f[i][j][k]\) 表示考虑前 \(i\) 个点,\(j\) 条线段没有结束,目前的贡献为 \(k\) 的方案数,考虑转移加法贡献,不妨令 \(t\gets (a_{i+1}-a_i)\times j\)

\[f[i+1][j][k+t]\gets (j+1)\times f[i][j][k],f[i+1][j][k+t]\gets f[i][j][k]\times j,f[i+1][j+1][k+t]\gets f[i][j][k] \]

然后就做完了,答案是 \(Ans=\sum f[n][0][i]\) qwq


CF1332E

不难发现约束只在奇偶性,设叠了 \(h\) 层,那么 \(nmh=\sum a_{i,j}+2n\)\(n\) 是操作次数,然后分类讨论:

  • \(nm\) 是奇数,那么 \(奇/偶=定+偶\),任意情况合法,\(Ans=(r-l+1)^{nm}\)

  • \(nm\) 是偶数,那么 \(偶=定+偶\),我们要求 \(定\) 是偶数的方案数,用 \(E/O\) 表示可以选择奇数/偶数个数。

\[Ans=\sum_{i=0}^{\frac{nm}{2}}\binom{nm}{2i}O^{2i}E^{nm-2i} \]

这个东西长得像二项式定理的展开式,那么不如:

\[(O+E)^{nm}=\sum_{i=0}^{nm}\binom{nm}{i}O^iE^{nm-i}=\sum_{i=0}^{\frac{nm}{2}}\binom{nm}{2i}O^{2i}E^{nm-2i}+\sum_{i=1}^{\frac{nm}{2}}\binom{nm}{2i-1}O^{2i-1}E^{nm-2i+1} \]

同理可得:

\[(O-E)^{nm}=\sum_{i=0}^{\frac{nm}{2}}\binom{nm}{2i}O^{2i}E^{nm-2i}-\sum_{i=1}^{\frac{nm}{2}}\binom{nm}{2i-1}O^{2i-1}E^{nm-2i+1} \]

加一下就能得到 \(Ans=\frac{(O+E)^{nm}+(O-E)^{nm}}{2}\),指数可以用拓展欧拉定理,但是记得特判。


P5590/CF241E

边权范围 \(val\in [1,9]\),不难想到差分约束,使用差分约束跑出 \(dis\) 再钦定边即可。

注意有一些边,不跟原图有相关性,但是跑不出差分约束,这种我们要去掉再做。


P4197/P7834

我们按照最小生成树的顺序加边,新建一个点,连接两个要连接的联通块,然后做出一个重构树,有很多美好的性质。

我们发现一个只要找到需要局面的联通块最高点,其子树即为所求,写一个主席树维护答案即可。


CF915F

\(I\) 拆成路径最大最小两次做,对于最大,不妨按照 \(a\uparrow\) 去做,那么这个 \(a_i\) 在加入这个点的当前联通块有贡献,对这个跨越联通块计数,累加贡献即可,最小的可以直接 \(a_i\gets -a_i\) 再跑一遍。


CF570D

对于每一个深度开一个 vector,状压做一个异或前缀和,每次用 dfn 二分左右端点出来,异或判断即可。


CF958E2

先写一个 wqs 二分,然后不难发现两个一段已经很优了,那么直接 dp 就行了。


AT_apc001_e

没有仔细想随便编了一个做法 ac 的比较多随便改改过不了小拍子但是不知道为什么反正就过了。

乱搞思路是不知道为什么觉得跟链相关那么叶子和多度点随便弄一点贡献。


CF1032F

不难发现完美匹配和孤立点是合法的,那么不妨设 \(f[x][0/1/2]\) 表示点 \(x\) 是单点 / 组成完美匹配 / 差一个完美匹配 的方案数。

\[f[x][0]=\prod (f[y][0]+f[y][1]),f[x][2]=\prod (f[y][0]+2\times f[y][1]) \]

\[f[x][1]=\sum f[y][2]\times \frac{f[x][2]}{f[y][0]+2\times f[y][1]} \]

答案就是 \(Ans=f[1][0]+f[1][1]\),做完了。


P2446

贪心,加上拓扑排序的约束,跑最短路即可,清空一个点要取约束。


P3188

有人被 01 背包创急了我不说是谁(

题目有一个 \(w_i=a\times 2^b\),那么首先 \(2^b\) 相同的先按照普通 01 背包合并。

问题是不同层的背包怎么合并?首先我们不能从大到小,那么我们只能从小到大,我们发现非整位在后面没有办法直接贡献了,设计 \(f[i][j]\) 表示考虑 \(i\) 位及以后得情况下,先在同层转移。体积不超过 \(i\) 位及以后的 \(w\) 加上 \(j\times 2^i\) 的最大价值,考虑转移:

\[f[i][j] \gets f[i-1][2\times p+[m 的第 i-1 位=1]]+f[i][j-p] \]

答案是 \(f[len][1]\),做完了,不知道有人为什么被创。

posted @ 2024-04-11 07:42  Hypoxia571  阅读(30)  评论(0)    收藏  举报