你对我来说还仅仅是『梦』|

Nityacke

园龄:3年粉丝:21关注:24

12 月做题记录

12.1-12.15

P11364 [NOIP2024] 树上查询

简单题,不知道场上在干嘛,拿出 [l,r] 只有 O(n) 个区间的结论,然后找出来直接扫描线就好了。

实际上更好的做法是

LCA(l,r)=mindepi=lr1lca(i,i+1)

找出来建笛卡尔树,然后扫描线应该会更好写。

这个结论怎么能忘了的?

P7737 [NOI2021] 庆典

首先把可达性缩一下,然后对于每个点,只有一个点指向它,即我们缩点后再拓扑排序是一颗叶向树。

然后我们可以直接在上面跑虚树,记录每条虚树上的边和点的可达性,然后统计答案就很简单了。

P9120 [春季测试 2023] 密码锁

首先 k=1,2 的情况都是简单的。

然后考虑 k=3 的情况,枚举全局最大值和最小值之间的距离差值,然后二分,考虑剩下一个数可以是哪些,不难发现,对于此时剩下一行的最小值,每一列的限制是存在于若干个区间的并集之内,然后把并集拆成若干不交的,此时就询问是否存在一个点被覆盖了 n 次,这个可以直接线段树区间加,全局最大值。

k=4,不难知道变成了矩阵并加,询问全局最大值,由于每列矩阵个数只有 O(k),所以可以暴力处理,然后扫描线处理即可,复杂度似乎是 O(nk2logn)

P3352 [ZJOI2016] 线段树

大概是考察 01 序列怎么做,然后拆成若干值域段,整体 dp 即可。

P7907 [Ynoi2005] rmscne

不是很难的扫描线题。

由于存在单调性,可以简单解决。

P6185 [NOI Online #1 提高组] 序列

简单分析一下即可。

P7782 「MCOI-Zero / AC6-M03」 Sipli Field

简单树分治题目。

P4886 快递员

神秘树分治题目,大概是考察最大值的路径所在位置,然后点分治下去找哪个子树。

P9669 [ICPC2022 Jinan R] DFS Order 2

不是很困难的 dp,需要回退背包。

P4437 [HNOI/AHOI2018] 排列

那个什么 Exchange Argument 板子。

P3749 [六省联考 2017] 寿司餐厅

最小割板子。

P8367 [LNOI2022] 盒

siai 前缀和,首先我们可以写出暴力式子。

ans=i=1n1wij=0S|jsi|Val(j,i)Val(Sj,ni)

其中 Val(n,m) 表示把 n 个球放到 m 个盒子,且每个盒子可以为空的方案数,不难知道是 (n+m1n1)

此时我们复杂度为 O(nS),可以通过 40pts

考虑把绝对值拆开,然后设:

f(n,m,i,k)=j=0k(i+j1j)(mj+ni1mj)g(n,m,i,k)=j=0kj(i+j1j)(mj+ni1mj)=j=0ki(i+j1j1)(mj+ni1mj)=ij=0k1(i+jj)(mj+ni2mj1)=i×f(n+1,m1,i+1,k1)

所以我们只需要求解 f(n,m,i,k) 即可。

我们考虑莫队的思想,每次增加 i 或者 k 即可。

增加 k 可以直接计算,现在的问题变成了如何计算增加 i 的时候的答案。

换一个角度考虑 f。
f(n,m,i,k) 的组合意义是前 i 个数和 k 且所有 n 个数和为 m 的方案数。
其实就是把 m 个无序的小球放进 n 个有序的盒子里,要求前 i 个盒子里的小球总数不超过 k
而这相当于从左往右第 k+1 个小球不在前 i 个盒子里!
枚举第 k+1个小球放在哪个盒子里,可以得到:

f(n,m,i,k)=j=i+1n(j+k1j1)(nj+mk1nj)

然后此时 i 增加 1 就容易计算了,时间复杂度 O(n+S)

P10982 Connected Graph

简单题。

P6596 How Many of Them

钦定有 k 条割边,然后二项式反演。

然后考虑钦定 k 条割边如何计算,不难发现把 k 条割边拿走后是若干连通块,所以我们先做一个连通块计数。

然后我们考虑连通块如何通过 k 条割边拼起来,不难发现这是 prufer 序列经典问题,然后我们把这个贡献系数融进去即可。

AT_agc017_f [AGC017F] Zigzag

考虑一条链一条链转移,每条链用其差分后的数组状压成二进制数描述形态。

然后考虑一个点一个点转移,很难发现的一点是我们每次实际上不用记录之前有多少个 1,而是可以直接消去前一条链的第一个 1,这样我们就可以方便的描述其是否合法。

AT_agc024_e [AGC024E] Sequence Growing Hard

我们考察如果知道 An,如何求出有多少 A0,A1An1

我们发现,从 AnA0 的过程相当于每次删掉一个数,并要求字典序递减。

然后我们考虑删去第 i 个元素后,如何比较,首先我们知道 sj=sj+1(ji),且前 i1 个元素相同。

那么如果 si=si=si+1,那么比较 si+1si+1

如果 si+1=si+1=si+2,那么比较 si+2si+2

所以我们一定是比较到两者不同或者比较到串的末尾。

s 删去第 i 个元素后字典序变小 的条件实际上等价于: si 大于 i 之后第一个不等于 si 的元素。

然后如果 s 存在多个相邻的相同元素,删去会存在相同的 An1,我们不妨钦定一个顺序,这样可以避免重复计算,由于我们还有删到串结尾的情况,所以我们可以钦定每次我们删除的就是每一段的结尾,此时的条件变成了 si>si+1 或者 si 是串的结尾。

我们考虑如何计数,考虑设 fi 表示长度为 i 的方案数。

为了避免重复,我们考虑枚举第一个 1 出现的位置 k 和删除时间 p,则前后两段分别构成一个子问题,但是前面一段不能再次出现 1,所以我们给状态加上一维,表示值域为 [1,j] 的方案数,则此时转移就是:

fi,j=k=1ip=0ifk1,j1fik,j(p1ik)

注意由于值域可以不满,所以我们需要做一个前缀和。

然后 dp 优化发现后面是一个上指标求和,直接做即可。

P9021 [USACO23JAN] Subtree Activation P

我们考察这个东西等价于什么。

发现是一个找若干条边,使得边权和最小,且形成一条经过所有点的欧拉回路。

我们可以建立一个虚点和所有点连边,这样变成了经过 0 的欧拉回路,简单 dp 即可。

CF303E Random Ranking

我们先离散化出 O(n) 个段,然后对于每个人,计算他在哪个段,然后计算这个段有 A 人,小于这个段的有 B 人的概率,则这人在 B+1,B+2B+A 的概率分别是这个的 1A,暴力计算是 O(n5) 的,然后观察 dp 过程是一个类似背包的过程,可以直接分治优化,O(n4logn),可以通过。

CF455E Function

首先我们可以把题目转化成,初始在 j,需要经过 i 时间,每个时刻可以选择往左走一步或者留在原地,每个时刻开始时需要累加上当前位置的 a,求最小代价。

不难发现我们一定是走到某个地方,然后停下来,设我们在 r,需要经过 l 时间,最后走到了 i,则代价为:

(l(ri))ai+srsi

式子拆开之后是一个一次函数形式,可以直接二区间合并+李超线段树做到 O(nlog2n+qlogn),套用 [CTSC2016] 时空旅行 的离线按斜率排序后建凸包可以做到 O((n+q)logn),但是不想写维护凸包。

CF1499G Graph Coloring

感觉比较牛的一个题。

首先考虑静态如何处理,我们考虑建立一个虚点,对奇数度数的点连边,然后跑欧拉回路,在这上面黑白染色,不难知道此时答案达到了下界。

然后考虑动态如何处理,如果你想着对于虚点删边连边就寄了。

实际上是你考虑删除虚点之后,原图变成若干环和若干链,环的部分不用再管,所以你只需要考虑链的部分,考虑连接这条边时,两边是否为一条链的一端,都是的话可能需要反转其中一条链的颜色,否则需要简单规划一下这条链的颜色。

然后翻转链的颜色部分,我们发现我们只有链的合并,则我们可以使用带权并查集维护即可。

CF164D Minimum Diameter

神秘的题目,求最小点覆盖+剪枝。

每次找到 deg 最大的点,考虑是否需要。

CF1909F2 Small Permutation Problem (Hard Version)

简单题,画出二维平面,然后计数比较简单。


12.16-12.22

P7450 [THUSCH2017] 巧克力

先二分中位数,把小于的看成 1000,大于的看成 1001,然后问题变成寻找最小权值的合法连通块。

color-coding 一下,然后发现是最小斯坦纳树,直接做即可。

AT_arc118_e [ARC118E] Avoid Permutations

S 表示一条从 (0,0)(n+1,n+1) 的路径,然后 P 为所有合法的障碍的集合,Q 是题目给定的。

然后现在就是计算:

ans=SQP[SP=]=SPPSP(1)|P|=SPS(1)|P|PP1

考虑如果确定了 P,那么我们剩下可以自由确定的只剩下了 n|PQ| 行,然后方案数就是其阶乘,所以:

ans=SPS(1)|P|(n|PQ|)!

然后我们就可以考虑 dp 来代替处理枚举 S 的过程,然后每次考虑是否这个点是否加入 P,同时记录 n|PQ|,然后 1 系数可以塞进 dp 过程里面,然后就结束了。

P4547 [THUWC2017] 随机二分图

由于期望的独立性,我们可以对于每组完美匹配出现的概率求和即可。

先考虑如果只有第 0 类边怎么做。

我们直接 dp,设 fi,S 表示考虑到左边第 i 个点,右边还剩下 S 集合内的点的期望,然后每次只需要枚举匹配点并考虑这个点匹配概率。

然后考虑有 1,2 类边的情况,由于匹配顺序可能比较混乱,所以我们考虑改成 fS,T 表示左边剩下 S,右边剩下 T 的期望。

然后为了不算重,我们考虑每次必须包含 S 中编号最小的节点。

看起来对了吗?似乎并不是。

如果存在 1 类边 (A,B),(C,D)0 类边 (A,B),(C,D),那么如果我们选择了 1 类边中的 (A,B) 后就不能选择 0 类边的 (C,D),否则就会出现一些神秘的重复。

我们考虑把 1 类边直接拆成两条边 (A,B),(C,D) 且概率都是 12,则此时我们发现可以一次如果我们该 1 类边的出现概率变成了 14,所以我们增加一条同时选择 (A,B),(C,D) 的边,概率为 14 即可,而 2 类边不难发现概率为 14 即可。

看起来状态数最多是 i=0n(ni)2=(2nn),实际上由于有 4n 个点一定包含左侧前 n 个点,所以状态数没有这么大。

然后直接 dp 即可。

P11175 【模板】基于值域预处理的快速离散对数

首先我们知道,BSGS 的复杂度是 O(B)O(PB) 的,所以有 A 次询问的话,复杂度是 O(A×P) 的。

然后我们考虑由于我们知道 log(xy)=logx+logy,所以我们可以线性筛出每个数的 log,复杂度 O(P+P2lnP)

复杂度无法接受,我们考虑设定一个 B=P+1,对于 xBx 计算出 logx

对于 >B 的询问,我们考虑 P=vx+r,则我们不难知道 0vP,则我们知道 x=Prv,即 logx=log(r)logv=log(P1)+logrlogv

然后我们又知道:

P=(v+1)x+rx,x=Pr+xv+1,logx=log(xr)log(v+1)

由于 log(v+1),logv 都是预处理过的,log(P1) 可以预处理出来,我们只需要计算 logr 或者 log(xr),不难发现我们每次选小的那个那么一定会折半,只会递归 O(logP) 次。

然后我们考虑此时的复杂度,不难知道变成了 O(P34logP+qlogP) 可以通过。

AT_agc003_d [AGC003D] Anticube

先分解掉 V13 的部分,保留形如 x1y2 的部分,然后考虑剩下的部分:

  • 1,那么我们只需要把 cntx2y1 比较,选多的即可。
  • p2,这个可以特殊判掉,和 x2yp 比较 cnt
  • p,此时考虑 x2yp2 即可。
  • pq,也是这样。

然后分讨几种后 map 维护一下即可。

AT_arc157_f [ARC157F] XY Ladder LCS

首先我们发现,长度为 3 时答案至少为 2

所以 n 的答案至少为 23n,所以我们一定不会跨过 13n 去匹配。

所以我们只需要状压 13n 的点是否匹配即可,复杂度 O(n2313n)

AT_arc124_e [ARC124E] Pass to Next

我们首先考虑怎么才能使得 S 两两不同,我们发现如果所有 ai1,那么我们可以让 ai 全部减去 1,然后此时 S 不变。

所以我们只需要按所有 ai0 做一遍,减去 ai1 的部分即可。

然后我们考虑怎么计数这个,首先假设是一条链,考虑 ai 的组合意义。

那么我们第 i 个人就有两种决策:

  • 选择自己本来剩下的。
  • 选择 i1 传给他的。

首先我们定义 S1(n)=i=0ni,S2(n)=i=0ni2

我们考虑直接 dp,由于自己剩下的跟传给下一个人有关,传过来的和上一个人有关,那么我们考虑把这两种分开。

fi,0 表示选原来就有的,因为有可能下一个人选择 i 传过去的,所以这一位的贡献系数不容易确定,和下一位一起确定,那么我们 fi,0 表示的是前 i1 个人的方案数。

fi,1 表示我传多少给下一个人都不会改变这一位的贡献系数,所以表示前 i 个人的方案数。

考虑转移:

fi+1,0fi,0×S1(ai)fi+1,0fi,1(ai+1)fi+1,1fi,0×(x=1x(aix))fi+1,1fi,1×S1(ai)

然后我们考虑如何初始化,首先我们钦定 1 号点选还是不选,初始化是直接初始化为 f1,c=1,就相当于只有这种方案有贡献,然后转移回 1 号点,得到答案 f1,c,但是一开始初始化时 f1,c=1,需要减去,即返回 f1,c1 即可。

AT_arc113_f [ARC113F] Social Distance

首先我们考虑 f(x) 表示 x 的概率,则期望就是 0+f(x)

然后我们考虑对于一个 w 如何求概率,我们令 aiaiw×i,则我们合法条件就是 ai 递增。

所以我们直接把每个点的取值区间变成 [xi1iw,xiiw],然后此时我们还是把这些区间拆成若干个值域段,那么我们考虑如果一个段内有 j 个数,那么有 1j! 的概率符合条件,然后我们就可以 dp 了,设 fi,j,k 表示考虑到第 i 个数,在第 j 个段,此时这个段有 k 个人的方案数,然后转移需要乘上一个 i 在当前段的概率,然后再考虑是否新开了一段,乘上 1k

这个东西我们发现,如果我们端点的相对位置不发生改变的话,那么我们每一段的左右端点都形如 ABwCDw 的形式,此时再当前段的概率就是一个关于 w 的一次多项式,所以最后是一个关系 wn 次多项式。

O(n2) 找到端点发现相对位置移动的断点,然后 dp 时暴力维护多项式,最后积分计算对于答案的贡献即可。

中间新开一段的部分使用前缀和优化,O(n6)

AT_abc383_g [ABC383G] Bar Cover

首先一眼丁真,鉴定为凸的,然后分治闵可夫斯基和即可。

复杂度 O(nk2logn)

P2508 [HAOI2008] 圆上的整点

高斯整数,不想写了/dk

P2408 不同子串个数

SAM 板子,增加子串个数是 lenlstlenlinklst

P4248 [AHOI2013] 差异

翻转一下变成 lcs,然后两个前缀的 lcs 就是两者在 link 树上 lca 的 len,随便 dp 一下即可。

P5161 WD与数列

首先差分一下变成差分数组,然后忽略长度为 1 的子串,然后枚举 lca,由于不相交,所以我们画一画发现在 lca 确定的情况下,一个下标对于另外一个下标的贡献是 O(1) 段一次函数形式,树上启发式合并一下,然后拿 BIT 维护即可,O(nlog2n)

P4094 [HEOI2016/TJOI2016] 字符串

恢复 SAM 记忆的练手题,比较简单。

首先公共前缀/tuu,翻转变成后缀。

然后我们发现直接做不好做,但是我们可以尝试二分一下,然后我们可以倍增找到 [dmid+1,d] 在 link 树上的等价类位置。

然后此时我们只需要判断这个等价类在 [a+mid1,b] 处是否存在 endpos 即可,线段树合并维护。

P4482 [BJWC2018] Border 的四种求法

CF809E Surprise me!

我们知道 φ(ij)=φ(i)φ(j)gcd(i,j)φ(gcd(i,j))

然后我们考虑对于每个 gcd,计算出此时的 φ(i)φ(j)dist(posi,posj),直接算不好钦定 gcd,可以先钦定倍数再反演。

我们钦定倍数计算时可以建出虚树,然后在上面 dp,然后由于 a 是一个排列,所以总节点数 O(nlogn),复杂度 O(nlog2n)

CF1290F Making Shapes

首先我们考察合法条件:

x+=xy+=yx+mx+m

我们发现 x,y 都很小,考虑数位 dp,dp 每一个向量 i 被选的次数 ci 在这一位的二进制 0/1 状态,记录一下进位数量,直接枚举状态 S 转移即可,我感觉可以逐个枚举 ci 状态,看起来复杂度比枚举 S 优秀,但是可以通过就不管了。

CF1990F Polygonal Segments

我们考虑无法继续拓展的区间一定是 [l,r] 满足 sumal1sumar+1

然后我们发现这样的区间种类数只有 O(logV) 个。

算了不想写了,大概知道意思怎么合并差不多得了。

CF1368G Shifting Dominoes

首先黑白染色后,发现我们我们看成空格移动,则我们可以建出一个图,但是我们分析一下,会发现这个图没有环,是一颗树的形式。

然后我们发现黑白染色之后两者独立,所以我们可以分开考虑,然后移除一个骨牌之后两个格子都可以在自己子树内部的格子内任意选择,即覆盖了一个矩形范围,所以我们相当于有 O(nm) 个矩形覆盖,求面积并,扫描线即可。

CF235C Cyclical Quest

SAM 板子题,因为 SAM 支持在 link 树上查找时删除首字母。

CF653F Paper task

简单题,对于每个等价类随便搞一下结束了。

LOJ6071 「2017 山东一轮集训 Day5」字符串

失配的时候走到下一个 SAM 即可。

然后在这个 SAM 上 dp 一下即可。

LOJ6198 谢特

简单题,枚举 lca,然后 Trie 统计最大值,复杂度爆炸。

考虑树上启发式合并一下即可。


12.23-12.31

P9877 [EC Final 2021] Vacation

不是很难的题,按 C 分块,分成块内和跨块处理,跨块可以再拿一颗线段树维护。

AT_abc248_h [ABC248Ex] Beautiful Subsequences

分治一下,记录左边后缀最大,最小值 ai,bi ,右边前缀最大,最小值 cj,dj

枚举 i,分别考虑 ai,cjbi,dj 中的哪个值,四种情况。

然后不难发现每种情况我们合法的都是一个区间,二维数点即可。

P4566 [CTSC2018] 青蕈领主

P7581 「RdOI R2」路径权值(distance)

长剖板子。

P6847 [CEOI2019] Magic Tree

线段树合并优化 dp,然后有个取 max 操作可以直接线段树上维护最大最小,然后颜色段均摊。

P5439 【XR-2】永恒

题意要求计算:

u<vx<y,[x,y][u,v]dep2lca(px,py)

然后我们考虑这个如何计算,首先考虑 x,y 关系。

  • 无祖先关系,那么 (u,v) 点对数量是 szx×szy
  • 否则假设 xy 祖先,那么点对数量是 (nszv)×szyvxy 路径上第 2 个点。

先都当无祖先关系算,然后重新计算 xy 祖先时的贡献,可以直接 dfs 一遍+数据结构维护即可。

P4652 [CEOI2017] One-Way Streets

首先由于一个边双一定能定向成为一个 SCC,这一部分可以通过耳分解说明,然后 SCC 内部的边全部反向后一定还是 SCC,所以我们考察边双内部的某条边的时候实际上都可以随意定向。

然后剩下的只有割边,如果我们边双之间有定向就这么定向,树上差分一下即可。

P5234 [JSOI2012] 越狱老虎桥

题目大意:给定一张图,A先添加1条边,B 再删去一条边使得图不连通,A 要最大化删除边的权
值,B 要最小化删除边的权值,问最终的权值是多少。

简单题。

考虑缩完边双得到一棵树,那么我们增加一条边可以保证一条链的边不被割,然后我们从小到大考虑割边,能保护就保护,暴力做复杂度正确。

P6335 [COCI2007-2008#1] STAZA

仙人掌 dp,考虑一个环的贡献,首先分成 fi,gi 表示需不需要回来的最大值,记录 w=gifi,这样 dp 的时候需要考虑 w,fi 即可。

然后转移画一画即可。

P4320 道路相遇

一定经过的就是圆方树上两者之间的圆点数量。

P10517 国土规划

相当于点集的虚树中的圆点数量,经典 set 维护,转边权后特判 lca 即可。

P8456 「SWTR-8」地地铁铁

首先变成只存在 d 或者 D 的路径计数。

首先考虑在不同点双的情况,称所有边都是 D 的点双为黑点双,所有边都是 d 的点双为白
点双,既存在 D 也存在d 的点双为混色点双,那么结论是如果两点在圆方树上的路径上全是黑
点双,或者全是白点双的时候才不合法。

考虑证明,如果有混色点双,我们在该点双外一定走过某种颜色,我们一定可以选择没走过的那个颜色。

所以只有全黑或者全白不合法。

然后此时计数就很方便了,直接并查集 merge 一下。

存在与相同点双的情况,首先我们只需要考虑黑白都有的点双。

然后我们知道知道我们可以经过任意点双内一条边,是否意味着全部都合法呢?

并不是,比如 102,203,311

不难发现此时 13 存在 1 和存在 0,但是不存在同时经过 01 的路径。

所以我们可以感性理解:不合法当且仅当点双内存在两个点使得其同时连接了黑色和白色的边。

然后就可以计数了。

P7477 「C.E.L.U-02」划分可重集

二分+ BIT 优化建图+2sat

P5332 [JSOI2019] 精准预测

对于点离散化,bitset 维护连通性即可。

为了空间开的下需要分块处理。

P6898 [ICPC2014 WF] Metal Processing Plant

很不错的一个题,假设 D(A)D(B) 首先考虑可以枚举 D(A),然后双指针枚举 D(B),跑 2-sat 即可。

复杂度 O(n4),不知道能否通过。

我们考虑优化,我们考虑枚举 D(A) 时,每次减少说明某两个点不能被分到一个集合,即我们需要是一个二分图。

那么如果我们发现 u,v 在之前就是同一个连通块内颜色不同的点,那么实际上这条边没有影响,我们可以先不管,之后再计算贡献。

如果是一个连通块内颜色相同的,说明不大能比这条边小,最后做一遍即可。

只有在不同联通块合并时,因为会带来新的限制,所以我们需要计算一遍,而计算可以二分 D(B),然后 2sat 判定。

复杂度 O(n3logn),可以通过。

AT_abc288_h [ABC288Ex] A Nameless Counting Problem

P1963 [NOI2009] 变换序列

二分图最小字典序完美匹配板子。

我们首先容易构造出一个二分图最,问题变成最小字典序完美匹配。

做法是这样的:先跑出一组完美匹配,从小到大考虑,在不影响前面的边,按字典序从小到大寻找出边,如果能增广出一个环就交换。

贴个代码方便理解:

Code
inline bool dfs(int x){
for(auto v:G[x])
if(!vis[v]){
vis[v]=1;
if(!mat[v]||dfs(mat[v]))return mat[v]=x,1;
}
return 0;
}
inline int dfs(int x,int rt){
for(auto v:G[x])
if(!vis[v]){
vis[v]=1;
if(mat[v]==rt||(mat[v]>rt&&dfs(mat[v],rt))) return mat[v]=x,v;
}
return 0;
}
inline void work(){
for(int i=1;i<=(n<<1);++i) sort(G[i].begin(),G[i].end());
for(int i=1;i<=n;++i){
memset(vis,0,sizeof vis);
if(!dfs(i)) cout<<"No Answer\n",exit(0);
}
for(int i=1;i<=n;++i){
memset(vis,0,sizeof vis);
cout<<dfs(i,i)-n-1<<" ";
}
}

P4100 [HEOI2013] 钙铁锌硒维生素

同上,线性相关部分是简单的,然后是同样的最小字典序完美匹配/

P3731 [HAOI2017] 新型城市化

首先,反图的最大团等于图的最大独立集。

那么实际上就是需要询问存在哪些边使得删除这一条边后最大独立集增大 1

由于声称了原图是二分图,所以最大匹配=n-最大独立集,所以就是删除哪些边后最大匹配会减少。

先 Dinic 跑一个最大匹配,如果现在就没有流量就可以忽略掉了。

然后我们考虑哪些边删去之后没有影响,比如现在一条 uv 的边有流量,考虑什么时候他没有影响,就是我们存在另外一条 uv 的增广路,由于此时我们在网络流中边的有权值方向是 vu,所以我们实际上可以相当于只保留边权为 1 的边后 u,v 在同一个 SCC 中,当然你保留 0 也是可以的。

P10674 【MX-S1-T3】电动力学

建立圆方树,根据直觉,我们应当枚举 T,然后我们发现此时 S 的取值是从 T 在圆方树上的虚树中任意选择,所以每个 T 的贡献就是 2sz(T)TT 的虚树,如果是方点就表示选择了周围的所有圆点。

我们先考虑由于一个圆点在路径上会同时被两个方点计算,所以我们直接令方点权值为 sz1 即可,此时发现虚树大小正好是虚树内部方点权值和 +1+1 的部分可以留到后面计算。

那么我们考虑 dp。

考虑一个以当前点作为深度最小的点的虚树如何产生,可以产生 2 棵子树内部的虚树的根到这里连边。

然后圆点讨论一下自己是否选择,方点乘上自己的贡献,即可。

至于子树中每个节点作为虚树根的贡献可以用一个 g 维护,这样合并一个子树上来的时候就十分简单了。

P11220 【MX-S4-T4】「yyOI R2」youyou 的三进制数

首先计数无序对,最后乘 2 即可。

首先我们发现这个变换是双向的,联想到图上取。

那么我们在图上的含义。

发现就是存在一条 z 到某个点 u 的路径,满足对于所有 xy 的路径,zuxy 恰好有一个交点。

不难从 xy 角度上来思考,有哪些 z 满足条件。

首先考虑建出圆方树,考虑 xy 这条路径,对于造成贡献的点有哪些。

  • zxy 路径上的圆点。
  • z 能不通过其他路径上的某个点的情况下到达一个圆点。

理解起来十分直观。

然后考虑如何计算答案,我们考虑枚举这个圆点,然后对于每个子树的统计答案就是在除了这个子树内部的两个不同子树选出两个点,然后子树加,可以差分维护。

P6792 [SNOI2020] 区间和

KTT + 吉司机线段树即可,维护的 k 应该是最小值个数,不是很难写。

P1971 [NOI2011] 兔兔与蛋蛋游戏

二分图博弈,现在才来学:一个点必胜当且仅当自己在所有的最大匹配内。

首先转化成为空格移动,不难知道我们一定不能移动回去,即每个格子只能通过一次。

黑白染色一下,不难发现每次移动改变颜色,我们可以看成一个二分图匹配。

然后我们只需要考虑有哪些 i 满足 S2i1 必胜且 S2i 必胜。

考虑如何简单判断一个点是否一定在最大匹配里面,跑出一组最大匹配。

然后每次给定一个新坐标相当于删除原来的点。

如果原来的点本来就不再匹配里,那么一定不是必胜。

否则删掉原来的点,找到其匹配点,如果能够增广,说明不是必胜。

P11225 [COTS 2019] 疏散 Sklonište

简单题,先对于所有关键点跑出最短路,然后二分+霍尔定理+高维前缀和 check 即可。

AT_abc303_h [ABC303Ex] Constrained Tree Degree

简单题, prufer 序列,考虑每个点度数为 di 时,方案数是:

(n2d11,d21,dn1)=(n2d1,d2dn)

上个 egf,所以我们考虑一个 di 的贡献是 1(di1)!,然后 n 个点说明是 Fn,多项式快速幂即可。

P11039 【MX-X3-T6】「RiOI-4」TECHNOPOLIS 2085

经 典 老 番

n 个有标号点,有 k 个连通块,每个连通块的大小是 si,则连通所有连通块变成一棵树的方案数是 nk2si

首先我们发现等价的条件就是虚树相同,我们先跑出虚树,不妨设虚树大小为 m,虚树根就是全树根,那么我们考虑一共有 n 个点,枚举有多少个加入链上,多少个靠点连接,枚举链上加入的点数,则答案就是:

Fn,m=i=0nm(nmi)(m1)i¯nnmi1(m+i)

但是有可能树的根不是虚树的根,需要拿一个点出来作为根,则答案是 Fn,m+(nm)Fn,m+1

P6961 [NEERC2017] Journey from Petersburg to Moscow

枚举第 k 的边权,然后发现不管是枚举的边权太小还是太大都不优,所以我们直接枚举后计算即可。

P2685 [TJOI2012] 桥

跑出一个最短路树,然后一条非树边可以更新的就是树上一个区间,然后我们可以直接找到这些区间区间取 min,可以用 multiset + 扫描线即可。

P4926 [1007] 倍杀测量者

二分一下,由于取对数之后变成 + 可以直接差分约束。

P4899 [IOI2018] werewolf 狼人

对于人和狼两种形态都建出 kruskal 重构树,可以倍增找到人和狼的活动范围,分别是一个子树,然后我们只需要找到一个点变身,就是给定两个排序,判断两个区间是否有相同元素,这个可以映射一下然后扫描线 + BIT 维护。

P11256 [GDKOI2023 普及组] 置换

首先考虑我们对于 X 建出 ipi 的图,然后发现是若干个环,然后我们发现,Y 相当于每个点走了 k 步,一个长度为 l 的环变成 gcd(l,k) 个长度为 lgcd(l,k) 的环,所以我们现在相当于你需要把若干个大小相同的环拼到一起。

然后每种大小的环分开考虑,设计贡献系数。

考虑此时环大小是 t,每次拼 j 个环过来,考虑此时贡献系数,首先钦定一个环在第一个位置,然后剩下的方案数是 (j1)!tj

而且我们转移是需要满足 gcd(k,j×t)=j,此时 k 一定是 j 的倍数,所以我们 j 只需要枚举 k 的因数即可,复杂度 O(nmin(d(k),n)logn)log 来自 gcd,由于常数非常小,吊打了 O(nlog2n) 的 poly 做法。

AT_abc299_f [ABC299F] Square Subsequence

哎呀,绒绒,建出子序列自动机,枚举第一个串结尾的位置 pos 即可。

AT_arc150_f [ARC150F] Constant Sum Subsequence

感觉,这个题,很牛逼。

首先我们不难知道 O(S2) 的暴力 dp。

fi=maxkinext(fik,k)

然后我们就可以做到 O(n2logn)

我们考虑分治,枚举 k,不难发现枚举量是 O(nlogn) 的。

由于我们可以推一推支配性,发现只有跟 mid 一样的更新有用,否则一定不如 mid 更新,这样修改次数降到了 O(nlogn) 次。

P5776 [SNOI2013] Quare

耳分解,维护伸出去的耳即可。

QOJ9245 Bracket Sequence

分治,然后 dp

QOJ3301 Economic One-way Roads

先按代价小的定向,然后需要联通图,耳分解即可。

CF1767F Two Subtrees

找到 dsu on tree 的序列,做双前缀莫队即可。

CF1740H MEX Tree Manipulation

树剖,然后先不考虑重儿子,每个点形如重儿子为 a 权值为 b,否则是 c ,ddp 维护即可。

CF1824E LuoTianyi and Cartridge

对于 min 扫描线,然后分析一下怎么取值即可,可能需要不断删点,用某个 JOISC 的队列维护方法。

CF217E Alien DNA

简单题,倒着做,然后每次找到可以删掉的部分即可。

CF1060F Shrinking Tree

我们把排列考虑成 n1[0,1] 的随机变量,然后设 fu(x) 表示 u 到根最大值是 x 的时候系数的期望,则我们枚举这条边的边权为 t,可以知道:

fu(x)=vson(x)(0xfv(x)dt+12x1fv(t)dt)

答案就是 frt(0),然后直接维护多项式积分和乘法即可,O(n3)

CF1988F Heartbeat

考虑最大值维护,维护左边降位次数和前缀最大值个数,右边同理。

然后合并的时候使用 dp 逐步转移优化即可。

CF1515G Phoenix and Odometers

那个经典非树边构成的环的基是整个图所有环的基,然后每个 SCC 单独处理即可。

CF1163F Indecisive Taxi Fee

删边最短路板子,可以直接 multiset 维护扫描线,不需要线段树了。

本文作者:Nityacke

本文链接:https://www.cnblogs.com/Nityacke/p/18613466

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Nityacke  阅读(51)  评论(0编辑  收藏  举报
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示