会做的:(C)、(G)、(H)、(J)
写一下不会做的题。
A
题意:
给定(n,m),有一个( ext{n-m})的二分图,中间有(n imes m)条容量为(1)的边,源点向左边(n)个点分别有容量为(a_i)的边,右边(m)向汇点分别有容量为(b_i)的边。
(q)次操作,每次给(a_i,b_i)加一或减一。
每次操作结束后,回答最大流是否为(sum a_i)。
Gale–Ryser 定理:将(a_i)降序排序,最大流为(sum a_i)的充要条件为(forall kin[1,n]),( ext{s.t.} sumlimits_{i=1}^k a_ile sumlimits_{i=1}^m min(b_i,k))。
证明:
最大流(=sum a_i)等价于最小割(=sum a_i)。
即枚举源点左边割掉(n-k)条边时((forall kin [1,n])),最小割(ge sum a_i)。
令源点割掉的集合与汇点割掉的集合分别为(S,T)。
此时割大小为:
(sumlimits_{i otin S }a_i+sumlimits_{i otin T}b_i+k imes(m-|T|))
显然(sumlimits_{i otin S}a_i)最优为(sumlimits_{i=1}^n a_i-sumlimits_{i=1}^k a_i),而一个点,有两种独立的选择,付出的代价分别为(b_i)和(k)。
那么最小割为(sumlimits_{i=1}^n a_i-sumlimits_{i=1}^k a_i+sumlimits_{i=1}^n min(b_i,k))。
需要满足(sumlimits_{i=1}^n a_i-sumlimits_{i=1}^k a_i+sumlimits_{i=1}^n min(b_i,k)ge sumlimits_{i=1}^n a_i),即(sumlimits_{i=1}^k a_ile sumlimits_{i=1}^m min(b_i,k))。
当(k=0)时,不等式取等号,故对于(1le kle n)仅需满足(sumlimits_{i=1}^k a_ile sumlimits_{i=1}^m min(b_i,k))。
得证。
(sumlimits_{i=1}^m min(b_i,k)=sumlimits_{j=1}^k sumlimits_{i=1}^m [b_ige j])。
令(c_k=sumlimits_{i=1}^m [b_ige k])
(sumlimits_{i=1}^k a_ile sumlimits_{i=1}^m min(b_i,k))等价于(sumlimits_{i=1}^k (c_i-a_i)ge 0)。
容易用线段树维护。
总复杂度(O(nlog n))。(假设(n,m,q)同阶)
细节:
注意输入时(b_i=0)的数据。
B
题意:
给定长度分别为(n,m)的序列({A_i},{B_i})。
对于坐标((i,j))的格子值为(A_i+B_j)((forall iin[1,n],jin[1,m]))。
求有多少点对(ile j),满足((i,1))只走右或下通过值(ge 0)的格子走到((j,m))。
结论:不能从((1,1))走到((n,m)),当且仅当存在下列四种条件之一:
(1)(exists iin[1,n]),( ext{s.t.}A_i+B_j<0(forall jin[1,m]))
(2)(exists jin[1,m]),( ext{s.t.}A_i+B_j<0(forall iin[1,n]))
(3)(exists xin[1,n],yin[1,m]),( ext{s.t.}forall ile x,A_i+B_y<0;forall jle y,A_x+B_j<0)
(3)(exists xin[1,n],yin[1,m]),( ext{s.t.}forall ige x,A_i+B_y<0;forall jge y,A_x+B_j<0)
证明:
这显然是必要条件,以下证明这是充分的(假设不存在任意一种,一定可到达)。
假设满足(min A_i+max B_jge 0,max A_i+min B_jge 0)。
那么我们要做的事就是,从起点到达蓝色方格,再沿着黄色方格到达终点。
两部分是对称的,现在集中精力到达蓝色方格。
令((p,q))为中间那个交点。
假设左上角((p-1) imes(q-1))网格如果同时包含被锁住的行和列,那么不可行。
否则,存在一行或一列,使得所有单元格均可达(原因和之前的一样)。
那么可以把((p,q))再进一步缩小,通过归纳,得证。
考虑对四种不合法的情况求并
(1)(A_i+max B_j<0),则(sle ile 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),( ext{s.t.}l_kle sle ele r_k)。
(3)固定(i),在(i)找到最大前缀均不合法,其在方格中向上抱住的部分均不合法。
(4)同(3)
可以通过矩阵并求出,但稍微分析一下,是可以不需要任何数据结构的。
总复杂度(O(n(log(n)+log m))),目前在( ext{gym})上是最优解。
C
题意:
给定一张无向图,需要给每条边定向(定向有费用),求有向强连通图的最小费用。
(nle 18)。(不包含重边与自环)
如果有低于(O(n^32^n))欢迎一起交流。
D
题意:
给定一张带权的无向图,要求补齐剩下的边及边权,要求(forall i,j,k),(w(i,j)ge min(w(i,k),w(j,k))),要求总边和和最小。
(n,mle 300000)
很容易发现,可以将条件改写成(forall i,j),(w(i,j)ge)所有路径最小值的最大值。
由于也包含((i,j))单条边的路径,所以(w(i,j)=)所有路径最小值的最大值。
如果我们得到了一张图,判合法性,就是求一个最大生成树,边((i,j))得满足(w(i,j))等于(i,j)路径上的最小值。
再回到原题,求一个最大生成森林,其他每条边都应是路径上的最小值,不在同一连通块的边权为(1)。
正确性显然
E
题意:
给定一个(n)个点(m)条边的无向图,求有多少(lle r),使得(l,l+1,ldots,r)的导出子图为一条链。
( ext{cc})出过树上版本的题...
将链抽象化
- (deg_ile 2)
- 连通或无环
- (V-E=1)
考虑图如果是树,由于不会形成环,那么可以略去一个条件
- (deg_ile 2)
- (V-E=1)
对于第一个条件,令(f(i))为最小的(j),满足([i,j])存在一个(deg_ige 3)的点,特殊的,若不存在这样的(j),令(f(i)=n+1)。
可以双指针线性。
对于第二个条件,令( ext{EC}(i,j)=(j-i+1)-边数),对于( ext{EC}(i,j)=1)的(ile j)可能合法。
对于一条边((x,y)(xle y)),可以将(1)加到矩形范围([1,x] imes[y,n])。
由于(V-Ege 1),因此只需要知道最小值及数量即可。
对左端点扫描线即可,查询([i,f_i))即可。
对于一般情况,需要将"连通或无环"这个条件加入进来,令(g(i))为最小的(j),是的([i,j])存在环。
也是可以通过双指针( ext{LCT})做到(O(mlog n))。
同样扫描线,查询([i,min(f_i,g_i)))即可。
具体而言,如果枚举(i),每次向右移,查看是否会形成环,显然这样复杂度是不对的。
枚举右端点,维护最小生成树,才可以做到(O(mlog n))。
当然还可以并查集分治,感兴趣可以写写/se。
细节:
由于要避免多次访问同一个点,为了方便令(g_i)为最大的(j)使得([i,j])不形成环:
令( ext{Solve(l,r,L,R)})表示(g_l,ldots,g_rin[L,R]),在进入此递归前,保证,([r,L])间的边以加入。
F
题意:
给定(n)个带权区间((l_i,r_i,w_i))((l_ile r_i,1le w_ile 10^{12})),要求保留一些区间,使得区间图为树(区间有交连边),求保留下来的区间权值和最大是多少。
(nle 250000,l_i,r_ile 500000)
观察1:区间图为树的充要条件为不存在一个位置被至少三个区间所包含。
证明显然
引理:若干个区间,每个位置被不超过(K)个区间覆盖,充要条件为,可以将区间分成(K)个集合,使得集合内部区间两两不交。
证明:
充分性是显然的。
对于必要性,考虑构造,对区间按左端点排序,对于已选好的(K)个集合,若加入新的区间,必定存在一个集合与其不交。
那么对于此题,对于((l_i,r_i,w_i)),(l_i)向(r_i+1)流一条容量为(1),费用为(-w_i)的边,对于(forall i(ige 0)),由(i)想(i+1)流一条容量为(infty),费用为(0)的边。
源点与汇点各有容量为(2)的边,跑一个最大流最小费用即可。
但这样复杂度显然不行,考虑优化。
定义:令(dist_i)为到点(i)的最短路
由于此图是( ext{DAG})图,所以流为(1)的情况可以直接在这上面线性跑。
但跑完流量(1)之后,原图会有许多边取反。
考虑取反这些边的性质,(dist_u+w(u,v)=dist_v),取反后的边时((v,u,-w)),有(dist_v+(-w)-dist_u=0),可以应用( ext{Johnson})最短路算法。
( ext{Johnson})最短路
有向带边权图(可能存在负权边),若已知任意一点到其他点的最短路。
由于(dist_u+w(u,v)ge dist_v),有(dist_u+w(u,v)-dist_vge 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(nlog n))。
G
经典的dp套dp,没写了
H
题意:
手里有(0sim N-1)的卡牌,每张卡牌有(c_i)张,对于一次操作,可以使用可重卡牌集合(S={a_1,a_2,ldots,a_k}(kge 1))生成( ext{mex}{S})的卡牌,希望手上只留下一种卡牌,问最后能留下的最大数字是多少。
简单题。
I
题意:
给定一棵带点权树,支持给某个子树的(a_i+1),支持给一条路径的(a_i+1),在每次操作完后,询问带权重心,若有多个重心,取离(1)最近的那一个。
(n,qle 1e5)
先不考虑修改,令(S=sum a_i),对于带权重心,以其为根,不存在某个儿子,其子树的(sum a_i)严格大于(S/2)。
由于(a_ige 0),带权重心可能在一条链上。
考虑令(1)为根,除(1)外,每个点(i)都有一个外向子树,外向子树最多包含(S/2),这意味着(i)这棵子树至少包含(lceil frac{S}{2}
ceil)。
按( ext{DFS})序排列,找到前缀和第一个大于等于(lceil frac{S}{2}
ceil)的位置,那么重心一个是包含这个位置所代表的点的。
假设其为(u),跳到(u)最近的祖先,满足(size_ige lceil frac{S}{2}
ceil)((size_u=sumlimits_{vin subtree(u)}a_v))
然后继续往上跳,(u)跳到(fa_u)需要满足(size_ule lfloorfrac{S}{2}
floor)。
均可以用倍增加速。
子树大小用线段树维护。
(O(nlog^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}),为偶数则在另外一张图,使得两张图均连通。要求在各自图上为平面图。
(nle 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),若(lle ile r),那么这两种操作是必定有连边的。
所以可以转化成:
有若干点与区间,选择一个区间,则区间内的点不能选择;若选择一个点,包含这个点的区间不能选择。最多选择多少。
这是个经典贪心问题。
总复杂度(O(nlog n))。