XXI Open Cup. Grand Prix of Korea

会做的:\(C\)\(G\)\(H\)\(J\)
写一下不会做的题。

A

题意:
给定\(n,m\),有一个\(\text{n-m}\)的二分图,中间有\(n\times m\)条容量为\(1\)的边,源点向左边\(n\)个点分别有容量为\(a_i\)的边,右边\(m\)向汇点分别有容量为\(b_i\)的边。
\(q\)次操作,每次给\(a_i,b_i\)加一或减一。
每次操作结束后,回答最大流是否为\(\sum a_i\)

Gale–Ryser 定理:将\(a_i\)降序排序,最大流为\(\sum a_i\)的充要条件为\(\forall k\in[1,n]\)\(\text{s.t.} \sum\limits_{i=1}^k a_i\le \sum\limits_{i=1}^m \min(b_i,k)\)

证明:
最大流\(=\sum a_i\)等价于最小割\(=\sum a_i\)
即枚举源点左边割掉\(n-k\)条边时(\(\forall k\in [1,n]\)),最小割\(\ge \sum a_i\)
令源点割掉的集合与汇点割掉的集合分别为\(S,T\)
此时割大小为:
\(\sum\limits_{i\not\in S }a_i+\sum\limits_{i\not\in T}b_i+k\times(m-|T|)\)
显然\(\sum\limits_{i\not\in S}a_i\)最优为\(\sum\limits_{i=1}^n a_i-\sum\limits_{i=1}^k a_i\),而一个点,有两种独立的选择,付出的代价分别为\(b_i\)\(k\)
那么最小割为\(\sum\limits_{i=1}^n a_i-\sum\limits_{i=1}^k a_i+\sum\limits_{i=1}^n \min(b_i,k)\)
需要满足\(\sum\limits_{i=1}^n a_i-\sum\limits_{i=1}^k a_i+\sum\limits_{i=1}^n \min(b_i,k)\ge \sum\limits_{i=1}^n a_i\),即\(\sum\limits_{i=1}^k a_i\le \sum\limits_{i=1}^m \min(b_i,k)\)
\(k=0\)时,不等式取等号,故对于\(1\le k\le n\)仅需满足\(\sum\limits_{i=1}^k a_i\le \sum\limits_{i=1}^m \min(b_i,k)\)
得证。

\(\sum\limits_{i=1}^m \min(b_i,k)=\sum\limits_{j=1}^k \sum\limits_{i=1}^m [b_i\ge j]\)
\(c_k=\sum\limits_{i=1}^m [b_i\ge k]\)
\(\sum\limits_{i=1}^k a_i\le \sum\limits_{i=1}^m \min(b_i,k)\)等价于\(\sum\limits_{i=1}^k (c_i-a_i)\ge 0\)

容易用线段树维护。

总复杂度\(O(n\log n)\)。(假设\(n,m,q\)同阶)

细节:
注意输入时\(b_i=0\)的数据。

B

题意:
给定长度分别为\(n,m\)的序列\(\{A_i\},\{B_i\}\)
对于坐标\((i,j)\)的格子值为\(A_i+B_j\)\(\forall i\in[1,n],j\in[1,m]\))。
求有多少点对\(i\le j\),满足\((i,1)\)只走右或下通过值\(\ge 0\)的格子走到\((j,m)\)

结论:不能从\((1,1)\)走到\((n,m)\),当且仅当存在下列四种条件之一:
(1)\(\exists i\in[1,n]\)\(\text{s.t.}A_i+B_j<0(\forall j\in[1,m])\)
(2)\(\exists j\in[1,m]\)\(\text{s.t.}A_i+B_j<0(\forall i\in[1,n])\)
(3)\(\exists x\in[1,n],y\in[1,m]\)\(\text{s.t.}\forall i\le x,A_i+B_y<0;\forall j\le y,A_x+B_j<0\)
(3)\(\exists x\in[1,n],y\in[1,m]\)\(\text{s.t.}\forall i\ge x,A_i+B_y<0;\forall j\ge y,A_x+B_j<0\)

证明:
这显然是必要条件,以下证明这是充分的(假设不存在任意一种,一定可到达)。
假设满足\(\min A_i+\max B_j\ge 0,\max A_i+\min B_j\ge 0\)
那么我们要做的事就是,从起点到达蓝色方格,再沿着黄色方格到达终点。
两部分是对称的,现在集中精力到达蓝色方格。
\((p,q)\)为中间那个交点。
假设左上角\((p-1)\times(q-1)\)网格如果同时包含被锁住的行和列,那么不可行。
否则,存在一行或一列,使得所有单元格均可达(原因和之前的一样)。
那么可以把\((p,q)\)再进一步缩小,通过归纳,得证。

考虑对四种不合法的情况求并
(1)\(A_i+\max B_j<0\),则\(s\le i\le e\)的所有点对\((s,e)\)不可行。
(2)考虑最小的\(B_j\),对于满足\(A_i+B_j<0\),分成若干段\([l_1,r_1],[l_2,r_2],\ldots,[l_m,r_m]\),对于\((s,e)\)不合法当且仅当\(\exist k\)\(\text{s.t.}l_k\le s\le e\le r_k\)
(3)固定\(i\),在\(i\)找到最大前缀均不合法,其在方格中向上抱住的部分均不合法。
(4)同(3)

可以通过矩阵并求出,但稍微分析一下,是可以不需要任何数据结构的。
总复杂度\(O(n(\log(n)+\log m))\),目前在\(\text{gym}\)上是最优解。

C

题意:
给定一张无向图,需要给每条边定向(定向有费用),求有向强连通图的最小费用。
\(n\le 18\)。(不包含重边与自环)

如果有低于\(O(n^32^n)\)欢迎一起交流。

D

题意:
给定一张带权的无向图,要求补齐剩下的边及边权,要求\(\forall i,j,k\)\(w(i,j)\ge \min(w(i,k),w(j,k))\),要求总边和和最小。
\(n,m\le 300000\)

很容易发现,可以将条件改写成\(\forall i,j\)\(w(i,j)\ge\)所有路径最小值的最大值。
由于也包含\((i,j)\)单条边的路径,所以\(w(i,j)=\)所有路径最小值的最大值。

如果我们得到了一张图,判合法性,就是求一个最大生成树,边\((i,j)\)得满足\(w(i,j)\)等于\(i,j\)路径上的最小值。

再回到原题,求一个最大生成森林,其他每条边都应是路径上的最小值,不在同一连通块的边权为\(1\)

正确性显然

E

题意:
给定一个\(n\)个点\(m\)条边的无向图,求有多少\(l\le r\),使得\(l,l+1,\ldots,r\)的导出子图为一条链。

\(\text{cc}\)出过树上版本的题...

将链抽象化

  • \(deg_i\le 2\)
  • 连通无环
  • \(V-E=1\)

考虑图如果是树,由于不会形成环,那么可以略去一个条件

  • \(deg_i\le 2\)
  • \(V-E=1\)

对于第一个条件,令\(f(i)\)为最小的\(j\),满足\([i,j]\)存在一个\(deg_i\ge 3\)的点,特殊的,若不存在这样的\(j\),令\(f(i)=n+1\)
可以双指针线性。

对于第二个条件,令\(\text{EC}(i,j)=(j-i+1)-边数\),对于\(\text{EC}(i,j)=1\)\(i\le j\)可能合法。

对于一条边\((x,y)(x\le y)\),可以将\(1\)加到矩形范围\([1,x]\times[y,n]\)
由于\(V-E\ge 1\),因此只需要知道最小值及数量即可。

对左端点扫描线即可,查询\([i,f_i)\)即可。

对于一般情况,需要将"连通无环"这个条件加入进来,令\(g(i)\)为最小的\(j\),是的\([i,j]\)存在环。
也是可以通过双指针\(\text{LCT}\)做到\(O(m\log n)\)
同样扫描线,查询\([i,\min(f_i,g_i))\)即可。

具体而言,如果枚举\(i\),每次向右移,查看是否会形成环,显然这样复杂度是不对的。
枚举右端点,维护最小生成树,才可以做到\(O(m\log n)\)

当然还可以并查集分治,感兴趣可以写写/se。

细节:
由于要避免多次访问同一个点,为了方便令\(g_i\)为最大的\(j\)使得\([i,j]\)不形成环:
\(\text{Solve(l,r,L,R)}\)表示\(g_l,\ldots,g_r\in[L,R]\),在进入此递归前,保证,\([r,L]\)间的边以加入。

F

题意:
给定\(n\)个带权区间\((l_i,r_i,w_i)\)\(l_i\le r_i,1\le w_i\le 10^{12}\)),要求保留一些区间,使得区间图为树(区间有交连边),求保留下来的区间权值和最大是多少。
\(n\le 250000,l_i,r_i\le 500000\)

观察1:区间图为树的充要条件为不存在一个位置被至少三个区间所包含。

证明显然

引理:若干个区间,每个位置被不超过\(K\)个区间覆盖,充要条件为,可以将区间分成\(K\)个集合,使得集合内部区间两两不交。

证明:
充分性是显然的。
对于必要性,考虑构造,对区间按左端点排序,对于已选好的\(K\)个集合,若加入新的区间,必定存在一个集合与其不交。

那么对于此题,对于\((l_i,r_i,w_i)\)\(l_i\)\(r_i+1\)流一条容量为\(1\),费用为\(-w_i\)的边,对于\(\forall i(i\ge 0)\),由\(i\)\(i+1\)流一条容量为\(\infty\),费用为\(0\)的边。
源点与汇点各有容量为\(2\)的边,跑一个最大流最小费用即可。

但这样复杂度显然不行,考虑优化。

定义:令\(dist_i\)为到点\(i\)的最短路

由于此图是\(\text{DAG}\)图,所以流为\(1\)的情况可以直接在这上面线性跑。
但跑完流量\(1\)之后,原图会有许多边取反。

考虑取反这些边的性质,\(dist_u+w(u,v)=dist_v\),取反后的边时\((v,u,-w)\),有\(dist_v+(-w)-dist_u=0\),可以应用\(\text{Johnson}\)最短路算法。

\(\text{Johnson}\)最短路
有向带边权图(可能存在负权边),若已知任意一点到其他点的最短路。
由于\(dist_u+w(u,v)\ge dist_v\),有\(dist_u+w(u,v)-dist_v\ge 0\),将边权修改为\(w'(u,v)=dist_u+w(u,v)-dist_v\),那么所有边均为非负,令新图上\(s,t\)的最短路为\(dist'(s,t)\),那么在原图上\(s,t\)的最短路则为\(dist'(s,t)-(dist_s-dist_t)\)
正确性显然

总复杂度\(O(n\log n)\)

G

经典的dp套dp,没写了

H

题意:
手里有\(0\sim N-1\)的卡牌,每张卡牌有\(c_i\)张,对于一次操作,可以使用可重卡牌集合\(S=\{a_1,a_2,\ldots,a_k\}(k\ge 1)\)生成\(\text{mex}\{S\}\)的卡牌,希望手上只留下一种卡牌,问最后能留下的最大数字是多少。

简单题。

I

题意:
给定一棵带点权树,支持给某个子树的\(a_i+1\),支持给一条路径的\(a_i+1\),在每次操作完后,询问带权重心,若有多个重心,取离\(1\)最近的那一个。
\(n,q\le 1e5\)

先不考虑修改,令\(S=\sum a_i\),对于带权重心,以其为根,不存在某个儿子,其子树的\(\sum a_i\)严格大于\(S/2\)

由于\(a_i\ge 0\),带权重心可能在一条链上。

考虑令\(1\)为根,除\(1\)外,每个点\(i\)都有一个外向子树,外向子树最多包含\(S/2\),这意味着\(i\)这棵子树至少包含\(\lceil \frac{S}{2}\rceil\)
\(\text{DFS}\)序排列,找到前缀和第一个大于等于\(\lceil \frac{S}{2}\rceil\)的位置,那么重心一个是包含这个位置所代表的点的。

假设其为\(u\),跳到\(u\)最近的祖先,满足\(size_i\ge \lceil \frac{S}{2}\rceil\)\(size_u=\sum\limits_{v\in subtree(u)}a_v\)
然后继续往上跳,\(u\)跳到\(fa_u\)需要满足\(size_u\le \lfloor\frac{S}{2}\rfloor\)
均可以用倍增加速。

子树大小用线段树维护。
\(O(n\log^2 n)\)(假设\(n,q\)同阶)

J

题意:
给定一个长度为\(n\)的'L','R','U','D'的字符串,\((0,0)\)点是障碍物,\(q\)次询问,每次给定一个坐标,问沿着字符串走,如果某一步之后走到了\((0,0)\)则忽略那一步,问最后走到的位置。

简单题。

K

给定二维平面上的\(n\)个点(两两不同),求最短的序列\(\{s_1,\ldots,s_k\}\),构建两张图,\(i\)为奇数,在第一张图连\(s_i,s_{i+1}\),为偶数则在另外一张图,使得两张图均连通。要求在各自图上为平面图。
\(n\le 1000\)

为什么这种题都想不出来...
做法1:将点按\((x,y)\)分别为第一和第二关键字排序,然后顺次连边即可。

做法2
先随意求出一棵生成树,但可能线段直接有交,如果两点\((a,b)\)\((c,d)\)有交,那么换成\((a,c)\)\((b,d)\)无交,且欧几里得距离之和更小。
那么求出欧几里得最小生成树,必定满足为平面图。
然后也一次遍历即可。

L

给定长度为\(n\)的钢板,对于位置\(i\),其向上的宽度与向下的宽度分别为\(a_i,b_i\)
可以进行若干次操作,每次把其中一块钢板,垂直切或水平切,切成恰好两块钢板,求切成若干块矩形的钢板的最小操作次数。

钢板的边界,由若干凸点凹点组成。

比如,矩形为四个凸点组成。

结论1:存在最优解,每次切,两个端点至少有一个凹点。

证明:
由定义可知两个端点均不为凸点,若两个点均为直线的中间部分,那么可以将最优解的部分切线移动,至少之一在端点上。

以下假设每次切都至少有一个凹点。
每次切完后,凸点个数可能增加,凹点个数不会增加,凹点个数一定减少。
那么最小化操作次数,就是等价于最大化两个凹点的操作数。

考虑两个凹点的操作形态
(1)垂直切,这个显然。
(2)水平切,在两个凸点切,中间的高度需要全部大于凸点所在的位置。

结论2:连接两个凸点操作形态,在二维平面上,若两种操作的线段有交,则两条线段间有边,两个凹点的最大操作数,等于线段间的最大独立集。

水平之间的操作无交,垂直之间的操作无交,故这是个二分图。
二分图最大独立集=点数-最大匹配。那么可以二分图匹配做到\(O(|V|^3)\)

观察这个二分图的性质,对于垂直的位置\(i\),对于所有操作\(l,r\),若\(l\le i\le r\),那么这两种操作是必定有连边的。
所以可以转化成:

有若干点与区间,选择一个区间,则区间内的点不能选择;若选择一个点,包含这个点的区间不能选择。最多选择多少。

这是个经典贪心问题。

总复杂度\(O(n\log n)\)

posted @ 2021-04-22 15:59  Grice  阅读(383)  评论(0编辑  收藏  举报