2025做题

1|001-18

居然到18号才开始写日记/qd/qd

  • 道路の建設案
    曼哈顿距离不好做,考虑转换成切比雪夫距离,然后就把绑定的两维的限制变成两个一维的限制了,然后二分答案,对于每个二分的答案x,都把当前遍历到的值到xix都放到set里,然后对于y这一维直接在x里查就行了,如果有的话那res就加一,最后看看有没有达到限制就行了。转换挺巧妙的。
  • k-d-sequence
    我看题解才会的。首先先把序列都对d取模,那么合法的就一定是连续一段一样的值,然后考虑对一段模完一样的值都变成模d的余数,那显然合法的就是这里的一段排序之后max-min+1-(l-r+1)<=k,然后转换一下就变成了max(L,R)−min(L,R)+L≤k+R,考虑枚举r,然后发现这玩意可以用线段树维护一下,具体地,肯定是这个数的余数大于前面的数的话那这个数就要进线段树更新,然后发现这玩意不好直接维护,用一个单调栈就好了,难想又难写。
  • Pudding Monsters
    考虑每行每列只有一个布丁,所以我们直接按x轴压成一维,然后就是上一题了。
  • 上帝造题的七分钟 2 / 花神游历各国
    胡扯题,发现106开6次根号就到1了,所以可以把全是1的区间打个标记,如果要修改的区间全是1的话就不用改了,然后用改的直接暴力改,反正用不了多少时间,然后就是普通线段树了。

2|001-20

  • Blocking Elements
    注意到复杂度,只能O(nlogn),所以考虑二分,二分答案,然后发现可以用第二条作为限制,只要这一段的和大于二分的答案了就把这个点变成分界点,最后判断分界点的和是否合法,但是显然这样很假,甚至过不了第二个样例,因为第二个样例是把第一个变成分界点,然后就遇到困难了,发现不知道在哪开始作为第一个分界点的时候答案是最优的,所以就想到可以dp,把每一个点是分界点的情况都算一下,具体地,设fi表示第i个选成分界点的最小价值,转移就是在i1到尽量靠前的满足这一段的和小于二分的答案,在这一段里找到上一个分界点,使值最小。然后发现这样dp复杂度是O(n2)的,但是发现那个上一个的最小的分界点的那段可以做dp的时候用单调队列维护,所以dp就愉快的变成O(n)的了,总复杂度是O(nlogn)
  • Magic Matrix
    注意到数据范围很小,前两个限制可以暴力做,后面一个发现很难做,但是发现如果一直把限制递归下去,发现其实就是在一个图上的任意一个环上的任意一条边都满足这条边以外的环上的其他边的最大值比他大(这玩意能想出来的都是神人了),然后就发现如果对于边排序,只要当前遍历到的这条边不在环里就是合法的,反之就不合法,然后就做完了,复杂度可以近似估算为O(n2logn2)
  • Mind Control
    一眼题,没什么写的必要。
  • Flowerpot S
    考虑二分答案,然后发现是O(n2logn)的,过不去,考虑优化,发现可以提前用单调队列处理出来二分的答案的长度里的最大值和最小值,然后直接O(n)扫一遍判断合法不合法就行了
  • 萌萌哒
    神人题,发现很容易有一个并查集的暴力,就是对于每个限制区间暴力并查集合并,然后最后直接看有几个不同区间就行了,但是要O(n2),然后就不会了,但是感觉已经到头了,应该得数据结构优化,但是想了很久也只能想到线段树,但是不会怎么线段树+并查集,所以就不会了,看了题解之后才知道原来可以用倍增,然后局势就豁然开朗了,直接对于限制下放到下面两个区间,然后最后统计答案就行了。
  • XOR Tree
    这种树上异或的玩意显然第一眼就能想到转换成到根的路径,然后就有一个很显然的O(n2logn)暴力,具体地,枚举lca,然后对于子树内如果有两个点的异或再异或上lca等于0的话就改lca,而且一个lca最多改一次。然后发现这玩意很可以用树上启发式合并,然后复杂度就能过了。

3|001-21

  • Xor-MST
    想到最小生成树,但是发现代价是两个点的异或和,然后思考怎么能把任意两个点的这玩意排序下来,想到01-Trie,发现建出01-Trie之后就从底下到上面,从左到右依次选lca就行了,因为左边的显然更小,而且lca越靠下异或和越小,就可以直接做了。
  • Data Center Drama
    发现出边+入边是偶数这玩意的充要条件就是这玩意是个欧拉回路,所以就直接对于总度数是奇数的点之间连边就行了,然后考虑对于一个边长是偶数欧拉回路我们可以直接a>b<c>d<...<a就可以保证这玩意是入度和出度都是偶数了,如果是奇数条边的话就连个自环就行了。
  • Hemose in ICPC ?
    看到范围和12次,而且显然一个区间的子区间的查询值肯定小于等于这个区间,所以感觉可能是二分,于是往可以二分性的一维东西上想,又想到能把图转换成数列的玩意,想到了欧拉序,然后就出正解了,直接跑欧拉序,然后对于这个序列先询问一次最大值,然后直接二分就行了。
  • [ICPC2022 Xi'an R] Tree
    不难观察到操作1就是删掉一个链,操作二就是删掉所有叶子节点,然后发现如果想只用操作1把当前的树删没的话就是当前的叶子节点个数,然后就很好做了,直接每次删掉当前的所有叶子节点再重新计算哪些是叶子节点就行了,在这个过程中算ans的最小值。

然后又在南外上写了几道区间dp

4|001-22

  • Omkar and Last Floor
    发现肯定同一列的1越多越好,考虑区间dp,设fl,r表示在l到r列的得分最大值,考虑l,r中间的某列k,考虑跨过第k列的且区间在l,r之内的区间,把他们的1都放到第k列就行了,然后进行区间dp就好
  • P4766 [CERC2014] Outer space invaders
    发现跨过某个时间的所有区间肯定用这些区间里最大的R来消灭,考虑区间dp,fl,r表示把区间包含的所有区间都消灭的最小代价。考虑这个区间里包含的R最大的值所在的区间,然后在这个区间里找花费R能消灭的最大的区间,但是需要离散化。
  • P7297 [USACO21JAN] Telephone G
    暴力很简单,但是O(n2),发现优化很难,根本不会,然后看到很小的k还没用,所以想到可能跟k有关系,于是想到可以用分层图其实是在做分层图专题,考虑建k1层,每层内部i和i+1连双向边权为1的边,我们想要对第k+1层求答案,所以把(bi,i)(k+1,i)连一条边权为0的单向边,如果(bi,j)能传递的话,就建立(K+1,i)(j,i)的边权为0的单向边,然后对于起点是(k+1,1),终点是(k+1,n)的最短路就行了。
  • P10819 [EC Final 2020] City Brain
    能推出来式子的都是神人了。首先先跑一个最短路求出来任意两点之间的最短路,然后发现要求的两条道如果有重合的地方,那重合的地方肯定连续,因为如果不连续的话那两个连续点中间的不连续部分肯定有一条小于等于另一条,显然走更小的更优。所以考虑枚举重合的起点和终点,然后算出来对于每个重合的长度对应的最小的到起点和终点的最短路,现在考虑在哪用技能更优,发现这玩意列出来之后是个单峰函数,于是想到三分,三分完就是答案了。

5|001-23

  • Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
    发现他只给了22个字母没给26个,于是猜到应该跟状压有关系,所以直接先把字母压成状态,然后又看到任意序列的回文,所以猜想其实回文长啥样不重要,联想到回文的性质,发现其实只要最多只有一个出现单数次的字母就行了,加上之前的发现其实就跟异或一样,然后直接先把路线异或转成到根的异或,发现其实可以用很常规的思想转换为枚举点,然后看这个点的子树中的最大值,然后分成是否经过这个点,然后就可以O(n2)做了,发现时间复杂度还是不够,于是用dsu on tree
  • P3224 [HNOI2012] 永无乡
    很套路啊,线段树合并+并查集就行了但是我其实早就忘了咋写线段树合并了
  • Two Permutations
    这个想不到,这个真难,首先先把a序列的哈希求出来,然后通过推式子之类的玩意我们可以发现其实如果给a都加x的话那么整个数列的和的哈希就变成了x1npni,然后发现其实后面的求和是可以预处理出来的,所以对于加的x我们可以直接O(1)求出来,所以我们就可以把x从0到m-n加入a之后的哈希值都求出来,然后放进map里,然后考虑b怎么查,发现a是一个排列,所以可以把b先排个序然后按大小依次加入之前的在数组中的位置,然后考虑每次加入一个数之后当前有没有能对应上map里的哈希值的,如果加入了之后长度大于n了就删去最小的,然后发现这玩意很不好实现,于是考虑用一个权值线段树维护一下,就做完了
  • [ABC304E] Good Graph
    弱智题,并查集+map直接查就行了

又在南外写了几道区间dp

6|001-24

今天感觉确实没什么好写的,写了3道比较简单的区间dp和3道树形dp,然后把主席树板子和树剖写了一遍。
但是感觉都挺简单的,没啥能写上去的。

7|001-24

  • Misha and LCP on Tree
    这题挺难写的,但是思路还行,考虑两个序列的最长公共前缀,发现其实直接二分+哈希就行,但是现在转到树上了,所以比较困难,现在想怎么用log时间的玩意做,发现其实可以树剖,然后一段一段的哈希比较,如果在这一段的哈希不一样了就在这两段上二分就行了。
  • P1723 高手过愚人节
    这题其实挺简单的,想写这个的原因是我本来用的是二分+哈希想水过去,结果最后被卡了,才换的马拉车,以后有复杂度更优的尽量用更优的。
  • P1600 [NOIP2016 提高组] 天天爱跑步
    绷不住了,纯线段树合并水题,但是我这个废物调了+inf年。

8|001-25

先复习了一下莫队,写了两道模板题

  • P4462 [CQOI2018] 异或序列
    这种形式直接想到莫队,但是莫队的那个记录出现次数的玩意其实不仅可以当某个值用,也可以当桶用,别的直接按照莫队正常方式写就行了
  • P3758 [TJOI2017] 可乐
    发现n很小,t很大,感觉应该和图论啥的就没啥关系了,所以考虑到logt的做法,联想存图的邻接矩阵,想到矩阵,然后就很开朗了,直接矩阵快速幂就行
  • P6374 「StOI-1」树上询问
    考虑到如果z不在x到y的路径上,肯定不行,如果z就是lca的话那显然答案就是n-(x对应的那条路的lca的孩子的子树的大小)-(y的那条路的lca的孩子的子树的大小),然后考虑如果z在x或y到lca的路径上,那我们答案可以类比过来就是n-(x/y的那条路的lca的孩子的子树的大小)-(n-sz[z]),然后就没了,但是有一个比较强的玩意就是用dfs序判断x是否在z子树里的玩意是这道题最大的收获

还做了几道比较水的题。

9|002-03

补了补之前的题。

  • Maximum Rating
    发现有个上界和下界,然后发现其实上界和下界中间的都可以达到,所以可以直接权值线段树。
  • Expanding Array
    利用异或无限扩展(x,y),是进行“宽度优先搜索”的先决条件;于是你也不能认为,出现了相同的数就可以终止搜索,因为它可能还会对之后的结果产生影响
    更轻巧的思维方式是,考虑011/101,考虑000~111的所有数字是否可以构造出来,发现可以,于是用STL来判个重就行

10|002-04

省选考试,啥也不会,爆。

  • HDU6410 序列期望

    考场上想到了应该是O(Vn)的了,写出来是枚举h然后对每个区间算了,但是没写对,考完之后改了改取模和实现细节就对了。
    一定要仔细看题!一定要理解如何递推!
  • 牛客 分糖果

    赛时能写出来的是神人,赛时想到了应该是个容斥,也想到从链开始转化为环了,然后就推出来了个非常离谱的容斥,甚至还过了很多样例,结果最后错了。
    首先肯定是破环为链,然后考虑容斥,显然是所有情况-至少一个连续一样的+至少两个连续一样的……,然后就假定这个序列里有k个连续的相等的段,然后这一段全部取值相等的数里最大的取值肯定就是mini=lrai,设fi表示到i的时候的答案,然后加个容斥系数之类的,就能发现式子是fi=j=1i(1)ijfj1mink=jiak,然后考虑如何把链变成环,发现只需要考虑最后一位和第一位是否相等就行了,然后发现这样不好定这两个点的所在段的最小值,于是钦定第一个是序列中最小的,然后就可以直接减掉相同情况了。然后发现这玩意是个O(n2)的,于是考虑优化,考虑把(1)ij转化成(1)i(1)j,然后考虑用单调栈优化j=1ifj(1)jmink=jiak这一坨,发现可以,然后就能做到O(n)

11|002-05

  • P10597 BZOJ4665 小 w 的喜糖
    一看到每个糖都与原来不同就想到应该能用二反之类的东西搞出来,首先我们设fi表示至少有i个人和原来的糖果一样,别的不考虑的情况,那二反一下,答案就是g0,然后考虑fi咋求,发现不知道从i到i+1的时候不知道放到哪,所以考虑多加一维,设dpi,j表示前i种颜色j个相同的位置其他随便放的情况,发现可以这么转移

dpi,j=k=0min(cnti,j)dpi1,jkCcntikCsumjcntik

其中cnti表示第i个颜色的个数,sum表示1~i颜色的个数和,转移的方程式很好想,可以自行理解,然后就能做了。

  • P6076 [JSOI2015] 染色问题
    发现这玩意很难一块搞,考虑一个一个搞,首先先考虑每种颜色至少出现一次的限制,设fi为颜色最多有i种的情况,然后之后容斥一下就是答案,考虑用行和列的限制去求fi,首先枚举一个j表示最多使j行满足条件,然后就肯定有一个Cnj和一个容斥系数(1)nj,这个可以根据组合意义去推,然后是对于某一列选中的j行,每格都有i+1(空白)的情况,所以一共的情况就是(i+1)j,但是全部空白肯定是不行的,所以还要减一,最后有m列,所以还有个m次幂,所以总的就是

fi=j=1n(1)njCnj((i+1)j1)m

ans=i=0CfiCCi(1)Ci

  • P10596 BZOJ2839 集合计数
    感觉很像反演,所以往那里考虑,首先设fi表示选中的集合至少交i个元素的选集合方案数,有:fi=Cnk(22nk1)
    然后就直接二项式反演就行了。

晚上是比赛,2.8h时长+没有任何大样例+题目样例过水导致T1+T2都忘却了有多组数据要清空数组和变量,导致一共挂了160pts,T1T2加起来只需要补两行的清空就能拿到的160分我却没加,引以为戒,以后多想想,养成好习惯。但是比较不好的一点就是其实要是好好想的话T3T4我觉得我能拿70+92的,但是时间太短了,所以以后还是希望来点正经的比赛。
T1T2完全不用讲了,比较简单,一个小思维题一个类似折半搜索一类的玩意,只用枚举全排列然后用初始矩阵和答案矩阵直接找就行了,好像爆搜+剪枝也能过,有点水了。。下面是T3T4的原题

  • P6651「SWTR-5」Chain
    先考虑Subtask3,发现其实只需要维护入度为0的点到i的路径数量就行了,转移就是fv+=fu,然后转移的时候不能走ci,最后统计出度为0的合法的点的贡献就行了,算是个暴力但是赛时暴力居然挂了20,再考虑k=1的点,发现其实可以再维护一个从i出发到出度为0的点的数量,然后发现答案其实就是sumfc1gc1,其中sum表示一个点都不删的答案,到这里其实就比较能想到正解了,就是考虑容斥,发现可以利用拓扑序,对于每个y只需要把它的fy减去拓扑序在它前面的x的fxhx,y就行了,最后再乘上gy再用总答案减去就行了,期中hx,y表示的是x到y的路径数量。但是这道题要注意的点是一定要把代码写的常数小一点,要不会一直被卡。
  • P6378 [PA 2010] Riddle
    一个很显然的思路是直接对于每条边连着的两个点去连另一个点的反点,然后对于每一组点都连别的点的反点,然后跑2-SAT,最后判断自己和自己的反点是否在同一个强连通分量里就行了。但是这样建图的空间是O(n2)的,根本不行,会炸,但是居然能拿到92的高分,然后考虑优化建图,这优化方式反正我想不出来,能想出来的都是神人。你考虑原来的建图方式是这样的

    但是很多,所以考虑建辅助点来减少连边但是保证和原来的效果一样,发现可以这么建

    这样建发现和原来是等效的,所以只需要把原来的图这么建就行了。

12|002-06

上午改了昨天晚上考试的题,下午和晚上写容斥。

  • Devu and Flowers
    先考虑如果瓶子里的花是无限的,那有多少种选的方案,发现是Cs+n1n1,然后考虑容斥掉不合法的,答案即为:

Cs+n1n1i=1kCn+sai2n1+1<=i,j<=n,i!=jCn+saiaj3n1...+(1)nCn+si=1nai(n+1)n1

但是发现这玩意直接做复杂度是很爆炸的,所以考虑怎么优化。然后发现n很小,感觉应该是二进制枚举啥东西,于是就想到了对于0<=x<=2n1,它的二进制中共有p位为1,然后就可以用这玩意来表示上面的一项,然后这样做的话复杂度就对了,但是求排列组合的时候可能在Cxy中x很大,所以变换一下,发现可以把它和排列的转换搞出来,再递推做,就行了。

  • Gerald and Giant Chess
    考虑从起点到任意一个点的方案数,为Cx+y2x1,然后考虑怎么算到一个黑点且不经过它之前的黑点的方案,那肯定要先按x和y的大小排序,设fi表示从起点到第i个黑点且不经过别的黑点的方案数,发现其实就是总方案数-在它左上角的j:fjCxixj+yiyjxixj,然后就可以处理出来每个fi了,发现最后的答案就是:

Cn+m2n1i=1kfiCn+mxiyinxi

  • Make It One
    首先通过观察发现从2开始的质数一直乘到17就大于300000了,这一共才7个质数。然后开始思考这道题,发现我们可以先考虑选x个数,然后让他们的公约数为i的方案为fx,i,然后先不管x,因为x这层与x-1和x+1没有任何关系,所以可以在最外面枚举这玩意,然后我们发现其实fi求起来还是挺容易的,我们先预处理一个gi表示i在这个数列中的倍数个数,这东西的处理是个调和数级别的,具体地,gi=j=2,ij<=Vgij,然后倒着预处理就行了,然后推如何求fi,首先想到要想这几个数的最大因数是i,那必然他们要有个i为公因数,然后考虑减去最大公因数是i的倍数的,就是fi了,所以最后求fi的公式就是Cgixj=2,ij<=Vfij,然后倒着推就行了。

13|002-07

上午考南外的模拟赛,炸飞了,因为不知道树形dp自带的少O(n)的复杂度,以至于对着自己的正确代码想了一整个考试,最后也没打别的题的暴力,也没交题。

  • P7201 [COCI 2019/2020 #1] Džumbus
    发现其实这就是个树形dp,设fu,j,0/1表示现在在j点,收益是j,当前点选或不选,发现选的方案很好转移,直接fu,i+j,0=min(fu,i+j,0,fu,i,0+min(fv,j,0/1)),但是好像1的比较复杂,但是可以慢慢推,首先考虑从fu,i1,0转移过来,即fu,i+j,1=min(fi,i+j,1,fu,i1,0+au+min(fv,j1,0+av,fv,j,1)),再考虑从fu,i,1转移过来的发现可以分成j选、不选和之前不选现在选了的,就行了。

    就是这样,然后就可以直接转移了,然后答案可以O(qn)处理也可以直接先推一下后缀最大值,然后直接二分,但是其实我觉得2e8也能过。
    T2不知道原题是啥。

    首先有个没有操作3的40分,这个很好拿,直接看最后翻转好还是不好就行了,然后考虑操作3。
    发现可以处理出来每个可能序列的逆序对数量,由于n很小所以可以求出来,然后就没有了,难度在于没人能想到要用__int128

14|002-08

今天做了很多比较简单的期望,主要是之前基本没做过。

  • P6669 [清华集训 2016] 组合数问题
    发现只会1000的,所以考虑看题解。发现可以用卢卡斯定理,然后发现这玩意其实可以拆开每一位,然后进行连乘,即为答案,然后发现这样的话其实只有18位,然后考虑按位进行dfs,每次只需要看当前位对于这两个数枚举的数只要i<j就是1,反之就是0呗,然后就直接dp就行了。
  • P4707 重返现世
    绷不住了,会的是神人。首先考虑min-max容斥,然后考虑dp,记fi,j,k表示前i个数,选中的集合大小位j,iai=k,转移就很简单:

fi,j,k=fi1,j,k+fi1,j1,kai

然后考虑优化复杂度,考虑到min-max容斥最后计算答案的时候的系数是CT1k1(1)Tk,和上面的递推式两种的递推方法结合一下,然后发现其实这俩玩意的转移是非常相似的,都是(i-1,j)和(i-1,j-1),然后就可以一起转移了,考虑增加一个维度k在计算系数:

fi,j,k=fi1,j,kfi1,jai,k+fi1,jai,k1

  • FAVDICE - Favorite Dice
    其实直接考虑dp就行了,设fi表示现在已经投了i面了的期望方案数,然后转移方程就很简单了:

fi=infininfi1+1

移项,f0即为所求

  • Game on Tree
    考虑一个排列就是操作方案,然后考虑怎么会合法,其实就是一个点的祖先在它后面就行了,然后就发现其实这个序列合法的情况就是depu,然后总的答案就是1depi
  • P4316 绿豆蛙的归宿
    直接宽搜就行了,设fi表示从1到i点的期望步数,然后发现这玩意不能直接推,因为我们不知道从1到i的概率是多少,所以再记一个gi就行了:

gv=gu/outufv=(fu+wgu)/outu

值得注意的是,不能用dfs的,因为如果dfs就不可能正确的算gi了。

  • P5104 红包发红包
    第i个人抢到钱的大小的期望显然是x/2,快速幂就做完了。
  • P6046 纯粹容器
    n小的没边了,考虑比较大的复杂度,先对于每个i,找到它左右第一个比它大的数的下标,如果这个数想被删除,那要么li中间全没了,要么ir,然后就直接考虑左,右边的方案,再减去两边的方案就行了,最后把答案累加。
  • Vasya and Magic Matrix
    显然要先根据w的大小排序,然后对于w分成若干块,每块的答案显然一样,更新也应该在这一块全都处理完之后再更新,然后把式子列出来:

fi=1sai>aj(xixj)2+(yiyj)2+fj

其中,s是i前比i的w小的个数,然后把这坨展开,发现f_j,x_j,y_j,(x_j)2,(y_j)2可以前缀和维护,然后就做完了。

15|002-09

  • Fish
    发现n很小,直接状压,然后考虑枚举的每个状态,0就是现在这个鱼死了,1就是还活着,然后枚举0的每一个和1的每一个,然后考虑枚举到的这个1的杀掉了枚举到的0的,然后这个1的杀死这个0的还有一个概率,所以复杂度是2nn2
  • Let's Play Osu!
    感觉比较无敌,先考虑如果贡献是1的话,那就比较简单了,fi=(fi1+1)pi,然后考虑如果是平方,该怎么做,发现(x+1)2x2=2x+1,然后就比较能做了,考虑再维护一个gi表示从1到i都是1的期望,然后就很好转移了:

fi=fi1(1pi)+(fi1+2gi+1)pi

  • P1850 [NOIP 2016 提高组] 换教室
    这题也是无敌,能评蓝。。直接考虑fi,j,0/1表示在i,加上当前的一共换了j,当前换没换。但是转移非常长,就对于前面和现在的概率直接乘就行了。
  • P2221 [HAOI2012] 高速公路
    很2b,仔细想想就会发现根本不是期望,就是求这个区间的后缀和除Crl+12就行了,直接线段树维护就行了。
  • P3750 [六省联考 2017] 分手是祝愿
    其实仔细想想就能发现最优的关灯顺序肯定是从大到小看是否开着,要是开着就关上就行了。然后就考虑期望,设fi为关到i的期望次数,即为fi=in+nin(fi1+fi+1)然后就行了。
  • P3239 [HNOI2015] 亚瑟王
    还行,差点想出来。先考虑第i张卡被用的概率为dpi,答案就是i=1ndpidi,然后考虑怎么求,感觉肯定有个n2的dp,所以设fi,j表示r轮中前i个选了j个的方案数,那dpi的式子就呼之欲出了:

dpi=fi1,j(1(1pi)rj)

但是现在还差dp的转移,但是发现这玩意其实也很简单,要么从fi1,j转移过来,要么从fi1,j1转移过来,前面那个没选上,这个是选上了,把概率乘一下就行了。

16|002-15

我太菜了,一整个晚上才好好学会了树上启发式合并和点分治。

  • CF600E Lomsat gelral
    发现求的东西跟子树有关系,所以想到dsu on tree,然后发现其实就是板子
  • P4149 [IOI 2011] Race
    发现是求路径上的东西,所以考虑吧点分治,然后发现其实就是板子
    剩下的时间写了点南外的期望专题

17|002-19

  • Mocha and Diana (Hard Version)
    首先容易发现加边的顺序是对答案没有任何影响的。然后考虑固定一个点,先把两个森林里的相同的点的所在的连通块都和这个点不联通的都和这个点连边,这样的话第一个森林里和这个点没有联通的连通块中的点肯定在第二个森林里和这个点联通,反之亦然,然后发现现在我们只需要从两个剩下的里面每个随意拿出一个连边就行了,因为左边的与固定的点不联通的在右边肯定联通,反之一样,所以这两个集合里的点肯定在两个连通块里都没有交集。

18|002-20

  • Cheap Robot
    disu为从最近的一个加油站到u点的最小代价,考虑从任意一个加油站到u,只要能到且到的时候剩余的大于disu,那代价一定是disu,因为你到了之后可以从u再走到那个消耗最小的加油站再回来,这样代价就是disu了,然后你推一下式子。

    然后你就发现了,其实答案就是max(disu+disv+wi,j),然后很显然的是这个东西肯定也在最小生成树上,因为如果不在就有更优的了,然后只需要预处理出来这个最小生成树再对每次询问跑倍增就行了。现在难点来到求disu,你发现如果对每个加油站都求一遍单源最短路时间复杂度会炸,所以就建一个超级源点连上所有的加油站再从超级源点开始跑就行了。
  • Move and Swap
    容易得到一个O(n3)的dp,fi,j是红的在i,蓝的在j,然后你枚举蓝的从哪里转移过来就行了。考虑怎么优化,发现蓝的在哪并不重要,因为它可以从上一层任何位置转移到这一层任何位置,所以只枚举红色在的位置,如果不交换那就直接比较和这层最大值和最小值分别做差,取最大值和上一层更新这一层就行了,但是发现如果交换的话就得枚举j了,这显然是无法接受的,我们先考虑把交换的式子列出来

    然后我们发现这玩意其实只是这一层对这一层的转换有影响,所以可以每层先记录两个的最大值再更新,然后就做成O(n)
  • Complete the MST
    发现最优的肯定是只替换一个边,然后分讨,如果有一个环,这个环上没有被赋值的,那肯定往这个环上换一个这个边就行了,最小生成树的值不变。然后看没有环的话怎么办,发现你就对于每两个连通块直接暴力替换然后找哪个最优就行了
  • Towers
    我感觉这道题是最难的。考虑肯定叶子放是最优的,我们以 h 值最大的为根,那么就至少要在两个子树里有 hrt,对于其他点,只要在子树内存在不小于自身 h 值的就可以了。然后直接对于每个点做就行了,但是感觉很难想到。。。
  • Xorcerer's Stones
    fi,j表示在i,子树里异或和为j的最小代价就行了,但是要输出方案数,所以我们把这个里面记录转移到它的两个下标,最后直接递推往前输出就行了。然后考虑到对于子树大小是奇数的做和不做是一样的,又考虑到一个点如果做了,那它的孩子们就不可能做了。然后考虑是否转移,分两类就行了。具体为fi+1,j=fi,j,这是不做的,fi+szi,jib=fi,j,这是做的。

19|002-23

  • Up and Down the Tree
    你发现如果u里叶子节点距离u小于k的话那就能无损跳出。

    其中fu表示跳进u的子树里的贡献值,然后答案就是从根到任意一个叶子节点的最大值。
  • Strange Operation
    发现对怎么删计数很难,所以考虑记最后的可能方案。考虑记录两个1之间的零的个数,发现一段1不可能全消掉,然后考虑这一位选填1还是0,如果是1的话就到下一段记录,如果是0且现在填的0的连续个数大于原数列的了的话就找后面第一个段长大于等于当前连续个数的段,然后跳过去转移,这个第一个大于的可以用单调栈求出。难死了,想不出来
  • 外星人
    首先发现如果你模了x,那你再模比x大的就没有任何用了,所以那部分可以乱模。然后先考虑怎么计算最大的传递值,发现只需要fifi modbj就行了,最后直接找最大的。现在考虑怎么计算次数,发现其实能和前面那个一起转移。你考虑先把数组排序,从i转移到比它小的j的贡献其实就是 (Ni1)!Nimodaj!,N表示前缀和。然后直接转移就行了。
  • Expected diameter of a tree
    容易想到概率是诈骗,其实答案就是两棵树的所有连边方式的直径长度和/(siz_x * siz_y),然后发现重复的两棵树的询问的答案是相同的,所以考虑用map记录,现在考虑怎么计算答案,考虑某种连边的直径是啥,发现很显然是max(lenx,leny,mxx+mxy),其中前两个就是这两个玩意所在的树的直径,后面那个就是树种距离x最远的点到x的长度,前两个是固定的,所以变的其实就是后面俩,考虑使用双指针解决,然后发现可以二分,就可以做了,现在感觉复杂度是O(n2logn),但是其实不然,因为大小小于n的树的个数只有n个,所以本质不同的询问只有n个,而且有记忆化,所以最后复杂度就是O(nnlogn)

__EOF__

本文作者Rose_Lu
本文链接https://www.cnblogs.com/roselu/p/18682565.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Rose_Lu  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示