zoukankan      html  css  js  c++  java
  • 一句话题解(2021.1)

    6950. 【2020.01.16冬令营模拟】枇杷树

    直接暴力记忆化,求一个点到树内点距离和以及两点之间距离,前者状态m^2后者m^3(树以及两个顶点,顶点只可能是2m中的),map随便过

    CF1386C. Joker

    显然等于判断[1,L-1]∪[R+1,m]是否为二分图,枚举L求出每个L对应的最小R

    发现贪心不行,所以直接模拟维护从后往前加的lct,每次把环中最小的R删掉,如果是奇环就更新ans

    注意在加的过程中可能有未加但合法的边,左边不用管右边也不用管,因为删掉一条边后有关的只有连接两个连通块(两块的颜色可能反转)的,即跨过删掉边的,而这些边显然在删掉边之后加入,所以会一同删掉,同理不用再连锁删无用的树边

    loj2493. 「BJOI2018」染色

    首先二分图显然全部{0,1}卡掉,然后发现K3,3和K2,4也可以,于是大胆把>=3条非树边的判掉然后就过了

    如果存在两个不相交的环,则可以各选一条边然后根据起点选0/1用这条边卡(一边{0,2}一边{1,2}),一般情况就是找两条边使得四个端点都能通过非这四个点连通,这样可以卡

    先只考虑相交的情况,当>=3条非树边时图类似K2,4,若两个点都是4度则用四种颜色卡,否则在某个4点上拉一个环,环上选一条环外选一条即可卡掉

    所以判掉了>=3的,当<=2时直接找出两个环以及相交部分判

    agc050F - NAND Tree

    ① 显然每两次相邻的操作如果不操作同一个点,则可以交换抵消掉后面的,于是可以把两次操作合成一次,如果边数为奇就先合一次

    ② 在①的基础上魔改转化题意:每次选择一个三个依次相连的点x-y-z,用x吃掉y和z,问题在于当x=z时操作后不为x,但这样x->y->z和z->y->x抵消了所以没事,当x≠z时讨论得证

    ③ 在②的基础上枚举最后剩哪个点,发现如果一次操作与根无关则两种方向抵消,因此每次只能选根往下吃

    然后随便写个dp把树划分成若干长2的链,时间O(n^3)

    6935. 【2020.01.01冬令营模拟】祭(口胡)

    5k1分阴间做法:分治,考虑跨过分治中心的矩形,左边变成求区间内子区间min和,右边离线每加一次多两个询问区间,区间min和用单调栈+区间历史和维护

    正常log^2做法:扫描线+线段树+单调栈+树状数组,每次单调栈弹掉的乘上右面投影过去的面积(就是Σminl*minr)

    还可以一个log用吉司机树做

    CF1470E. Strange Permutadandiaozhantion

    显然可以把(i,j)连向(i+1+k,j-k),然后就是求字典序第j小的第i位

    对(i,j)->(i+1,j)维护重链,走重链直接二分到下一个不走的位置(到一个点的限制是[先前的,先前的+当前的],是一个单调内缩的区间),只会走c条轻边

    CF1446H. Finding satisfactory solutions

    发现限制就是把最终边以及之前的边加进去后,除了完全由最优边组成的环以外没有新的环

    dag计数,每次加上若干度数为0的点,容斥系数为(-1)^(|S|+1),则显然可以发现会算恰好一次

    把相同大小的环缩起来(1440)每次加若干相同的环,O(1440*n^3)dp即可

    CF1466I. The Riddle of the Sphinx

    单独一次操作很无力,但将两次操作组合即可做到询问一段前缀与给出等长串的大小关系(前面相同后面全1)

    先考虑一个5(n+b)的做法:

    维护一个栈,从低到高位数递增,第i位恰好匹配潜在max的前i位,考虑新加的串和栈顶的大小关系以及需要的操作次数

    ①小于:不加,2次(询问先大于后小于)

    ②等于:加同时找下一位,3次+1栈

    ③大于:弹栈顶,1次-1栈+①/②/③

    最后会剩下一些,接着从后往前用最长的比较现在的(2次),如果现在大就删后面,小就不加,最后剩下k个有长度为k的相同前缀,递归求解

    一个栈的势能是2,所以全②下非递归为5n,递归一次是(n,b)->(k,b-k)=>5k,势能总数为b,所以是5(n+b)

    优化:先把最后比较的那部分变成只比较大于,则最后剩下的是小于等于末串,在下一轮里会被恰好等于的干掉,这样是4(n+b)

    然后把前面的比较小于也去掉,原理同上就是递归进去的串里的前缀小于等于给出的,同时有至少一个等于,而且如果当前串小于给出的那么往后加的全是0,不会产生新的max,这样就3(n+b)了

    6944. 【2020.01.07冬令营模拟】球

    直接容斥后求算,最高只有三次和,写插值会被卡常

    6945. 【2020.01.07冬令营模拟】星空

    考虑暴力,费用流连S->i,i->i+1,i->T连边,发现每次增广等于加上一对点,满足加上后的括号序合法

    左括号在左好做,左括号在右需要保证中间非0,线段树维护区间内点对中间次数的min最小b和非最小b,再维护前后缀到最小值为止的minb

    6943. 【2020.01.05冬令营模拟】社会实践

    先构造一种方法:从后往前维护一个位置x,表示把前面[1,i]移到x,若当前和x相同就不动,否则把前面的移到第三根上,然后移i,最后用2^(i-1)-1移到x,总共要2^(i-1),求和得到上界为2^n-1

    现证明其最优,若当前相同仍移动则花费2^(i-1),大于前面的上界2^(i-1)-1,所以能不动就不动

    线段树维护经过后的位置变化以及答案

    CF1264E. Beautiful League

    先用总数-不合法数,不合法数=Σ(出度-1)*出度/2

    对于原图的边(u,v)新建一个点x,连st->x,x->u,x->v来表示哪个点被分配了1出度,对于每个i连n条流量为1费用依次递增的i->ed边,表示出度每+1的代价

    跑最小费用最大流,时间O(n^4log)能过,题解似乎直接模拟做到O(n^4)

    CF1470C. Strange Shuffle

    打表发现p一直是k,p前面的一段小于k后面一段大于k

    证明归纳,满足以p为中心往两边的两个数之和为2k,无论奇偶往外都是各k的贡献,p每次也把k贡献出去,最后剩下的一个/两个也一样

    所以随机出一个然后往前/后找k即可

    CF1470D. Strange Housing

    贪心往外扩,选了x后考虑与把x相连的 相连的加进去,显然有解

    loj#3347. 「APIO2020」有趣的旅途

    首先以0为根求子树大小即可O(n)找到重心,然后O(3n)找到相连的三个子树的深度集合,把集合从大到小排序

    如果只有两个子树,n为奇显然是(n-1)/2,n为偶就是两个n/2,所以直接跳

    如果有三个子树,则每次找当前最大的不在同一个子树内的跳,跳到存在某两个子树的和与另一个的差绝对值<=1且下一个要跳的是最大的就变成上面两个子树的情况,最后把根丢到较小的那边里

    因为每次选最大的可以通过归纳得到剩下两个中只有最多一个大于它,并且若当前不是最大的则下一个一定是最大的

    这样的话一开始轮流选最大的一定合法,因为若按顺序选abc不合法则a+b<b+c,即a<c,所以c和a显然不在同一个子树内,可以得到abc分别在三个子树内,即选a时bc都可选,那么若a<c则一定有a>=b,那会先选c而不是选b

    要保证是最大的才能转化,因为这样下一步选另两个子树都合法,同时保证从下下步开始可以交替选

    关于第一部分的3n爆标做法:

    做法一(from dyp):先询问1到每个点的距离d,然后儿子在d=2的中,询问距离找到儿子,然后询问儿子size找到重心,其他的点的距离当重心每往下走一步时+1,找到重心及三个相邻点,询问剩余点到相邻点的距离,分类讨论即可确定在哪棵子树以及到重心的距离

    两部分的点集无交,同时每部分每个点最多2次,加上初始的共3n

    做法二:初始的4n做法把找重心到每个点的距离去掉,问题是怎么找两个儿子,发现size大于其的第一个一定是父亲,询问这个点到其余点的距离,距离为2的点最多6个,把这6个点判一下即可,次数3n+6

    6936. 【2020.01.01冬令营模拟】瞬

    直接连通性dp会挂,因为对于子树t来说可以先放t后走一些子树,然后撤掉t后再往下走

    设f[i,j,k]表示走完子树i上一个选j还能放k个的答案,转移对于每棵子树考虑t放不放,不放就从j走下来

    因为树剖后只用log个就可以不用额外代价,所以k是log级别的,时间O(n^2logn)

    uoj#575. 【ULR #1】光伏元件

    如果没有k的限制那就直接拆行列连边,假设有限制[L,R,K],则连S->i1[L,L+K],i2->i1[0,R-L-K],i2->T[L,L+K],由于流量平衡所以i1和i2的流量限制在[L,R],并且二者的差在K以内,因为走i2->i1的话差不变

    跑dij费用流O(n^4),具体就是维护数组h,h初始为dis,然后边w'(u,v)=w(u,v)+hu-hv,因为是最短路所以非0

    然后找到一个流后把所有的hi加上当前的disi,这样仍满足条件

    证明的话有disu+w'(u,v)>=disv,所以如果u->v不流的话加上也满足

    否则有du+w'(u,v)=dv,du-dv+w(u,v)+hu-hv=0,(dv+hv)-(du+hu)+w(v,u)=0,有h'v-h'u+w(v,u)=0,即w''(v,u)>=0

  • 相关阅读:
    第四次作业和总结
    第三次寒假作业(剧毒)
    小问题+电梯
    寒假学习计划
    印像最深的三位老师
    Objective-c——UI基础开发第十一天(UICollectionView)
    Objective-c——UI基础开发第十天(自动布局)
    Objective-c——UI基础开发第九天(QQ好友列表)
    Objective-c——UI基础开发第八天(QQ聊天界面)
    Objective-c——UI基础开发第七天(自定义UITableView)
  • 原文地址:https://www.cnblogs.com/gmh77/p/14224160.html
Copyright © 2011-2022 走看看