• XXI Open Cup. Grand Prix of Korea


    会做的:(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))

  • 相关阅读:
    Git实战(二)原理

    Java实现 蓝桥杯 历届试题 核桃的数量
    Java实现 蓝桥杯 历届试题 核桃的数量
    Java实现 蓝桥杯 历届试题 核桃的数量
    Java实现 蓝桥杯 历届试题 核桃的数量
    Java实现 蓝桥杯 历届试题 核桃的数量
    Java实现蓝桥杯 历届试题 k倍区间
    Java实现蓝桥杯 历届试题 k倍区间
    Java实现蓝桥杯 历届试题 k倍区间
  • 原文地址:https://www.cnblogs.com/Grice/p/14690065.html
Copyright © 2020-2023  润新知