马上就要退役了,随手记录一下吧。
「CEOI2008」order
如果没有租,那么就是经典的最小割模型。
考虑处理租的情况,在没有租的情况中,一件产品会向它需要的产品连 I n f Inf Inf边,其实这就相当于租,把这条边的权值改完租的价格即可。
「ZJOI2011」营救皮卡丘
定义第 i i i个人的路径为 0 , p 1 , p 2 , p 3 , . . . , p k 0,p_1,p_2,p_3,...,p_k 0,p1,p2,p3,...,pk,其中 p 1 , . . . , p k p_1,...,p_k p1,...,pk都是由他第一次经过。(比如说第一个人走了 1 1 1,第二个人走了 2 2 2,然后第一个人走了 2 − > 3 2->3 2−>3,那么第一个人的路径为 1 − > 3 1->3 1−>3)。
这样定义后可以发现每个点只会在路径中出现一次,这样就转化为了一个路径覆盖问题,即用 k k k条链覆盖 n n n个点的 D A G DAG DAG。
设 d i s i , j ( i ≤ j ) dis_{i,j}(i \leq j) disi,j(i≤j)表示从 i i i到 j j j且只经过 ≤ j \leq j ≤j的点的最短路径,那么某个人的代价为 d i s 0 , p 1 + d i s p 1 , p 2 . . . dis_{0,p_1}+dis_{p_1,p_2}... dis0,p1+disp1,p2...。连边 ( S , 0 , 0 , k , 0 ) (S,0,0,k,0) (S,0,0,k,0),由于每个点都必须经过,把一个点拆成入点和出点,连边 ( i , i ′ , 1 , 1 , 0 ) , ( i ′ , T , 0 , 1 , 0 ) (i,i',1,1,0),(i',T,0,1,0) (i,i′,1,1,0),(i′,T,0,1,0),任意 i ≤ j i \leq j i≤j连边 ( i ′ , j , 0 , 1 , d i s i , j ) (i',j,0,1,dis_{i,j}) (i′,j,0,1,disi,j)。最小费用可行流即可。
「BZOJ3118」Orz the MST
定义一条非树边经过的树边为它的两端点在树上的路径的边的集合。
可以发现给定的生成树是最小生成树的条件是任意非树边的经过的树边的权值都不大于它。
显然,我们只会增加非树边的权值,减少树边的权值,设第 i i i条边的改变量是 x i x_i xi,改变的代价为 c i c_i ci。对于树边 i i i与经过它的非树边 j j j,存在这样的关系 w i − x i ≤ w j + x j w_i-x_i\leq w_j +x_j wi−xi≤wj+xj,即 x i + x j ≥ w i − w j x_i+x_j\geq w_i-w_j xi+xj≥wi−wj
那么题目便转化为最小化 ∑ i = 1 n c i x i \sum_{i=1}^n c_i x_i ∑i=1ncixi,同时满足 M M M个这样的条件 x i + x j ≥ t i x_i+x_j\geq t_i xi+xj≥ti。
把这个问题对偶(如果你不会对偶,可以戳这里),转化为
最大化 ∑ i = 1 M t i y i \sum_{i=1}^M t_i y_i ∑i=1Mtiyi,同时满足 n n n个这样的条件 y i + y j + . . . ≤ c k y_i+y_j+...\leq c_k yi+yj+...≤ck。
可以发现每个 y y y只会出现两次,且一次在非树边,一次在树边。那么树边,非树边分别向 S , T S,T S,T连 ( c i , 0 ) (c_i,0) (ci,0)边。对于每个 y i y_i yi,把它出现的树边向它出现的非树边连 ( I n f , t i ) (Inf,t_i) (Inf,ti)边。最大费用流即可。
顺便说一句,由于是求最大费用流而不是最大费用最大流,所以跑费用流时当 d i s t ≥ 0 dis_t \geq 0 dist≥0时就停止。
「Codeforces835E」The penguin’s game
设两个 x x x分别在 i , j i,j i,j。
考虑可以用 10 10 10次操作得出 i , j i,j i,j在各个二进制位上是否相同。然后肯定有一个二进制位不同,取出包含这个二进制位的所有数,这个集合里一定只存在一个 x x x。在这个集合里二分求出一个 x x x的位置,另一个直接算即可。
「UOJ77」A+B Problem
a n s = ∑ i 是 白 色 w i + ∑ i 是 黑 色 b i − ∑ i 是 奇 怪 的 p i = ∑ i w i + b i − ∑ i 是 黑 色 w i + ∑ i 是 白 色 b i − ∑ i 是 奇 怪 的 p i \begin{matrix} ans&=&\sum_{i是白色}w_i+\sum_{i是黑色}b_i-\sum_{i是奇怪的}p_i \\ &=&\sum_{i}w_i+b_i-\sum_{i是黑色}w_i+\sum_{i是白色}b_i-\sum_{i是奇怪的}p_i \end{matrix} ans==∑i是白色wi+∑i是黑色bi−∑i是奇怪的pi∑iwi+bi−∑i是黑色wi+∑i是白色bi−∑i是奇怪的pi
连边 ( S , i , b i ) , ( i , T , w i ) (S,i,b_i),(i,T,w_i) (S,i,bi),(i,T,wi)表示前两个减号。对于第三个减号,连边 ( i , i ′ , p i ) (i,i',p_i) (i,i′,pi),对于 l i ≤ a j ≤ b j l_i \leq a_j \leq b_j li≤aj≤bj,连边 ( i ′ , j , I n f ) (i',j,Inf) (i′,j,Inf)。对于第三个减号的连边,主席树优化即可。
「BZOJ3698」XWW的难题
这道题的模型跟 B Z O J 3118 BZOJ3118 BZOJ3118对偶后的问题比较相似,都是用一条边的流量表示一个出现在两个不等式里的变量的值。
首先把所有 A i , j A_{i,j} Ai,j向下取整,设取整后的结果是 a i , j a_{i,j} ai,j。然后对于 x i , j x_{i,j} xi,j,连边 ( i , j ′ , 0 , 1 ) (i,j',0,1) (i,j′,0,1),如果有流量经过则表示向上取整。
对于第 i i i行,设 s = a i , n − ∑ j = 1 n − 1 a i , j s=a_{i,n}-\sum_{j=1}^{n-1}a_{i,j} s=ai,n−∑j=1n−1ai,j,连边 ( S , i , s , s + 1 ) (S,i,s,s+1) (S,i,s,s+1)。对于列与 T T T的连边类似。
上下界最大流即可。
值得注意的是,如果 a i , j a_{i,j} ai,j为整数,那么上界与下界相同。
「Codeforces103E」Buying Sets
权值和最小,给权值取反,转为最大。
由于选择的子集包含的草药数 ≥ \geq ≥选择的子集数。所以把子集的权值设为 I n f − p i Inf-p_i Inf−pi,草药的权值设为 − I n f -Inf −Inf,然后选一个子集,一定选它包含的草药。所以这就转化为了一个最大权闭合子图模型,因为要使权值和最大,所以一定会使选择的子集数等于草药数。
「Codechef」Game of Numbers
先考虑一个简单的暴力,把所有符合条件的 ( i , j ) (i,j) (i,j) ( p , q ) (p,q) (p,q)分别向 S , T S,T S,T连边,然后符合条件的数对连边跑二分图匹配即可。
但是这样边数太多,考虑两个优化
- 如果两个数对 g c d gcd gcd相同,那么可以合并,同时修改到 S , T S,T S,T的流量即可。
- 对于每一个质数,如果两侧的数是它的倍数,则向它连一条边。
这样总边数为 O ( n 2 l o g n ) O(n^2logn) O(n2logn)的,可以通过。
「Codeforces510E」Fox And Dinner
由于 a i ≥ 2 a_i \geq 2 ai≥2所以相邻的两个数一定一奇一偶。
连边建图,其中与 S , T S,T S,T有关的边的流量为 2 2 2,表示一个点匹配它左右两个点。
「CS Academy」BFS-DFS
如果 d f s dfs dfs序和 b f s bfs bfs序的第二个元素不相等是无解的。
考虑构造一个菊花图。
- 对于 i ∈ [ 1 , n ) i \in [1,n) i∈[1,n),连边 d f n i , d f n i + 1 dfn_i,dfn_{i+1} dfni,dfni+1。⌋。显然只有原重心所在子树不符合条件。显然只割掉重心的相邻边,同时贪心地割最大的子树,如果割掉的子树大小加上原子树大小超过
- 对于 i ∈ [ 2 , n ] i \in [2,n] i∈[2,n],连边 1 , b f n i 1,bfn_{i} 1,bfni。
「CS Academy」Build the Towers
可以发现当构建一座塔后,构建时辅助的塔会被清空。所以从高到低直接构造,出现矛盾时无解。
「SRM577」BoardPainting
第一次做 t o p c o d e r topcoder topcoder呢。
可以发现如果相邻方向的两个格子染色方式相同,则答案减少 1 1 1。
对与横着相邻的两个点 ( x , y ) (x,y) (x,y),连边 ( S , u , 1 ) , ( u , x , I n f ) , ( v , y , I n f ) (S,u,1),(u,x,Inf),(v,y,Inf) (S,u,1),(u,x,Inf),(v,y,Inf)。
答案是联通块数+最小割。
「Codeforces757G」Can Bash Save the Day?
对于这种题考虑经典套路。
d i s ( u , v ) = d e p u + d e p v − 2 d e p l c a ( u , v ) dis(u,v)=dep_u+dep_v-2dep_{lca(u,v)} dis(u,v)=depu+depv−2deplca(u,v)
将 l c a lca lca的深度转化为链并( 1 − u 1-u 1−u的链与 1 − v 1-v 1−v的链)的长度。
每次把 1 − p i 1-p_i 1−pi的路径上的点的权值加 1 1 1,主席树+链剖分维护即可。
对于 2 2 2操作,可以发现只会改变第 i i i棵主席树的值,所以暴力重建即可。
「UOJ210」寻找罪犯
显然是2-SAT。
对于每个人和没句话各建两个点。
设当前这个人说了 k k k句话,然后建立前缀 p r e i pre_i prei表示当前这个人前 i i i句话是真的, s u f i suf_i sufi表示这个人后 k − i + 1 k-i+1 k−i+1句话是真的。 p r e i pre_i prei向 p r e i − 1 pre_{i-1} prei−1和第 i i i句话为真连边, s u f i suf_i sufi连边类似。然后由于每个人最多说一句假话,所以第 i i i句话为假向 p r e i − 1 pre_{i-1} prei−1和 s u f i + 1 suf_{i+1} sufi+1连边,这个人为真向 s u f k suf_k sufk和 p r e 1 pre_1 pre1连边。
「LOJ6115」汇合
考虑树分块。
可以发现每个点的编号可以表示为一个 20 20 20位的二进制数,对于二进制编号前十位相同且连通的点分为一块。这样每次跳一块时,二进制编号前十位肯定减 1 1 1,所以最多跳 2 10 2^{10} 210次。
「APIO2019」奇怪装置
考虑计算周期。设 t 1 , t 2 ( t 1 < t 2 ) t1,t2(t1<t2) t1,t2(t1<t2)对应的数对相等。
{ t 1 + ⌊ t 1 B ⌋ ≡ t 2 + ⌊ t 2 B ⌋ ( m o d A ) t 1 ≡ t 2 ( m o d B ) \begin{cases} t_1+ \lfloor \frac{t_1}{B} \rfloor \equiv t_2+ \lfloor \frac{t_2}{B} \rfloor (mod A)\\ t_1\equiv t_2(mod B) \end{cases} {t1+⌊Bt1⌋≡t2+⌊Bt2⌋(modA)t1≡t2(modB)
由条件 1 1 1,设 t 2 = t 1 + k B t2=t1+kB t2=t1+kB。
代入 2 2 2式,得 t 1 + ⌊ t 1 B ⌋ ≡ t 1 + k B + k + ⌊ t 1 B ⌋ ( m o d A ) t_1+ \lfloor \frac{t_1}{B} \rfloor \equiv t_1+ kB + k + \lfloor \frac{t_1}{B} \rfloor (mod A) t1+⌊Bt1⌋≡t1+kB+k+⌊Bt1⌋(modA)
所以 k ( B + 1 ) ≡ 0 ( m o d A ) k(B+1) \equiv 0 (mod A) k(B+1)≡0(modA)
由于 A , B A,B A,B是常数,所以 A g c d ( A , B + 1 ) ∣ k \frac {A} {gcd(A,B+1)} | k gcd(A,B+1)A∣k,由于 t 1 m o d    B t1 \mod B t1modB的结果共有 B B B种,所以循环节为 T = A B g c d ( A , B + 1 ) T=\frac {AB} {gcd(A,B+1)} T=gcd(A,B+1)AB。直接计算即可。
实测这题循环节长度不会暴long long
。
「APIO2019」路灯
可以发现如果没有修改操作的话, 这题显然可以离线+并查集。
按操作分块。把边分为两种,一种是在当前块中不会被修改的,另一种是在当前块会被修改。第一种边按上述的做法直接添加就行了。第二种的数量不会超过块大小个,所以每次询问时 f o r for for一遍即可。
「LOJ6042」「雅礼集训 2017 Day7」跳蚤王国的宰相
显然,重心的答案是 0 0 0。
考虑非重心的答案,需要通过嫁接一些子树使得这个点的最大子树大小 ≥ ⌊ n 2 ⌋ \geq \lfloor \frac {n} {2} \rfloor ≥⌊2n⌋。显然只有原重心所在子树不符合条件。显然只割掉重心的相邻边,同时贪心地割最大的子树,如果割掉的子树大小加上原子树大小超过 ⌈ n 2 ⌉ \lceil \frac {n} {2} \rceil ⌈2n⌉,那么就合法了。
「IOI2018」组合动作
先询问AB
,再询问A
或X
来找第一个字符。
设p[1..3]
为除了首字符之外的三个字符。
考虑已经确定了前
i
i
i位,怎么找第
i
+
1
i+1
i+1位。设已经确定的是串S
,询问S+p[1]+S+p[2]+p[0]+S+p[2]+p[1]+S+p[2]+p[2]
,如果贡献多了
1
1
1代表下个字符是p[1]
,如果多了
2
2
2代表是p[2]
,否则代表p[0]
。
最后一位会的询问串长会超过 4 N 4N 4N,所以像第一位一样询问就行,次数正好是 2 + N − 2 + 2 = 2 N − 2 2+N-2+2=2N-2 2+N−2+2=2N−2。