Typesetting math: 100%

做题记录——1.15-1.21

2022.1.15

CF1601D

神仙贪心题

CF367E

wdnmd,我第一步转化是对的,就是转成 2n 个端点,然后合法状况下他们一定可以构成一个括号序列,然后两两匹配

然后我 tm 往卡特兰数那一块去想了,寄(不过讲道理往卡特兰数那一块去想挺显然的,就是要注意题目的特殊条件,别乱猜结论,在结论不确定时候要谨慎!)

考虑 n>m 的时候一定无解,因为这就必然有两个区间的左端点相等,那他们必然包含

考虑把左端点看成左括号,右端点看成右括号,则必可以形成一个括号序列

对于一个点 i,有四种情况

1 啥也不放

2 放了一个左括号

3 放了一个右括号

4 放了一个左括号和一个右括号

然后按照这玩意直接 dp 就行

CF356D

最后会搞出来一个森林

对于每棵树,最省事的办法就是按照 ai 排序,然后把它搞成一条链

然后你直接 dp ,记录之前存在的位置就行了

因为 sb 出题人,所以你要 bitset 优化一下常数

综上所述,这是一道烂题

CF1292D

对树上路径和问题有了更深的理解

在树上关键点和的问题,可以证明最优点一定是某个关键点之一:如果在虚树外,那么显然移到最近的虚树点最优;如果在虚树上,那么根据两边的带权 size ,移到一点不会更劣

lca 挺好求,那这题就没啥了

CF1295F

这题跟 APIO 那题挺像的

因为sb zsh 看错题了,reverse 一下求单调不降的方案数

考虑离散化值域,设 fi,j 表示前面 i 个数,第 i 个在值域 j 的方案数

数据范围太小,暴力枚举就行了

用了一个在长度为 l 的区间内选 k 个不降的数的方案数是 (l+k1k) 的 trick

CF1179D

wdnmd WA 11,怒抄代码

其实就是容斥一下,斜率优化

长得也很像李超 tree,就是不知道为什么过不了 /fn

2022.1.16

CF1617E

感觉这题非常 sb 啊,不知道为什么 2700

你就直接连边,你发现每个点至多连 logai 条边

然后搞出来一棵树

然后就无了啊

CF578D

你先考虑在 s 上挖个空,然后扔回 t

那么对于相同的 t,答案是 n(m1) ,即和原串相同 index 的字符不同即可

那么答案就是 段数n(m1)

然后有一些东西会被算重,比如 abab,相当于把第一个 a 扔到了最后一个 b 后面,又相当于把最后一个 b 扔到了第一个 a 前面

那么处理出这样的极长段,减去它们的每个子串就行了

CF1408G

按照边从小到大排序,一个个加边

发现能分成一块,当且仅当它是一个团

用并查集,记一下每块的 size 和加边数量,merge 的时候卷积就行了

CF1453F

????我竟然能 20min 切 2700 的题目????

1453好

你大力考虑 dpi,nxt 表示从 i 开始,下一步跳到 nxt 的最小代价

然后你只需要保证 [i+1,nxt1] 这一段的点跳不到 nxt 就行了,用个 priority_queue 维护一下就行了

没了??????????

CF500F

每个物品上架持续时间相等,那么我们每次询问的区间就是 [aip,ai] 之间上架的物品

把时间轴分成 Lp 份,每份之间有一个关键点

那么每次询问的区间必然包括一个关键点

那么我们对于每个关键点往左和往右分别做 01 背包

每次询问对左右两个区间 merge 就行了

CF1146G

原本以为要 mcmf,口胡了亿堆模型,都挂了,果然没有网络流技巧 /ll

看了题解,发现只要普通的最大流

显然套路地拆点,把 i 拆成 i0,i1ih

S 连向 i0ih 连向 T ,容量 inf

然后假设每个点已经建了高度为 h 的楼

所以 ijij+1 连容量为 h2j2 的边,表示建高度为 j 的楼

再考虑罚金,每个询问建一个新点 p,对于 i[l,r],连边 ix+1p ,容量为 inf

然后连边 pT,容量 c

直接跑一发最小割就好了

CF48G

我又双叒叕假了

你考虑只在树上走的情况,换根一下,有手就行

然后你发现这是一颗基环树

那你把环单独拎出来,然后在环上的每个结点挂上 tag,往自己的子树里更新就行了

对于环上的结点 u ,设 dpu 表示它的子树内走到它的距离之和,这玩意也是有手就行

然后你考虑枚举环上的每个点,距离小于环一半的走左边,距离大于环一半的走右边

两边的操作类似

对于左边,显然有

fu=v可以走左边dpv+dis(u,v)×sizev

那么 dpv 比较好求,右边那项不是特别好求

你考虑把 dis(u,v) 拆开,因为在环上,变成 svsu

就可以前缀和优化了 /hanx

CF494D

把式子转化成

f(u,v)=2xS(v)d(u,x)2i=1nd(u,i)2=2xS(v)d(u,x)2dpu

先考虑式子的前半部分

lca=lca(u,v)

对于 depwdeplcaw,设 d1=dis(u,lca),d2=dis(v,lca)

d(u,w)2=(d(v,w)d2+d1)2=d(v,w)2+d12+d222d(v,w)d2+2d(v,w)d12d2d1

那么这玩意比较好做

对于 depw>deplcaw,设 d0=dis(u,v)

d(u,w)2=(d0d(v,w))2=d02+d(v,w)22d0d(v,w)

长得就很能做

然后考虑 dp,这玩意直接换根一下做完了

没了吧(

好像没有跟我做法差不多的,那我写个代码吧(咕咕咕)

2022.1.17

早上打了场比赛,390 分

这个 C 我也不知道为什么乱搞能过,学了一下 tutte 矩阵

这个 D 我也不知道为什么乱搞 90 分,没有想到点分治 + dfn 序 dp 就挺淦的

CF1034C

哦哦哦牛逼题

你思考一下,对于分成 k 个联通块,每个连通块的价值就是 Sk

那么 (u,fau) 这条边 cut 的必要条件就是 sumu0(modSk))

这也就证明了对于分成 k 个连通块,分法是固定的

那么对于每个 k,这种 u 的数量可以容斥一下求出来,时间复杂度 O(nlnn)

那么对于一个 k,它可以由 k=tdd 转移过来,再容斥一波

没了

CF1000G

感觉没有题解说的那么复杂啊

你就考虑除了 (u,v) 路径上的每个点,加一下从这个点往外跑路的贡献就行了

对于非 lca,他只能向子树内跑路,那么 dp 一下就行了

需要注意的是,有可能他跑着跑着跑到原路径的 son 去了,那你记一下就行了

对于 lca,首先它可以向上面跑路,这玩意树形 dp 乱做就可以了

其次它可以像非两个 son 的子树跑路,那你还是记一下两个 son,分类讨论就行了

甚至还是线性的(?

2022.1.18

mmp 昨天中午没睡觉,下午晚上没状态,非常生草

CF715C

艹差点被这题诈骗到了

你就考虑点分治,然后把每条路径整出来,分别把他作为前半部分和后半部分的值整进去

然后没得了

CF906D

有一个牛逼结论,φ(x) 的收缩速率很快,对一个数一直 φ,只要 O(log) 次,他就无了(

那你直接开整线段树,对于每个 v=φ,你记录一波这个区间的值

随便 merge

无了

CF1270G

麻了,又是一道牛逼建模题

因为 inaii1,所以 1iain

那么从 iiai 连边

n 个点,n 条边,每个点都有出边,这是一个基环内向树森林,不过这并不重要

考虑这个森林里的任意一个环,有 i=i+ai

那么这个环上的所有点就是答案

CF1370F2

危,一做这种稍微偏思维的题就寄

只想到了在 (u,v) 路径上的点的 l 一定是最小的,然后就不会了

你考虑把第一次询问得到的 x 设为根,然后把整棵树按照深度划分

你考虑二分这个深度,每次询问 depmid 这个集合里的点

如果 ans=l,就说明较深的端点的深度 mid

那么这样得到的最后一个合法答案就是其中一个端点 u

之后再询问到 u 距离为 l 的点集就行了

但是注意这样的理论询问次数是 1+log(1000)=12

有一个小的优化:较深的点的深度一定 l2,这样就能让二分次数减少一次,就能水过去了(

CF1458C

麻痹的哪个傻逼往题目 tag 里加了个 matrices,欺骗老子感情 /fn/fn/fn

这题是学诚还是学信讲的

大概就是把原本的二维点扩容成三维点

然后就是普及组模拟题(

CF713D

本来看这题面又臭又长打算喷人,看了一眼出题人是 Sonechko ,那就算了,不喷了 /hanx

之前做过一个 2400 的跟这玩意类似的题,但是看起来比这题牛逼多了

你考虑一个点作为正方形的最左上的点,最大边长是多少

这玩意你二分一个 d,然后就 check fi,j+1d1,fi+1,jd1,ai+d1,j+d1 就行了

然后对于询问,你二分一波,能得到左上端点大概在一个范围里

然后你 二维线段树(?) check 一下这个区域里的 fi,j 最大值就行了

啊啊啊啊啊啊啊这个 arsijo 是谁啊啊啊啊啊啊啊 还我 Sonechko 姐姐啊啊啊啊啊啊啊 /流汗黄豆(差不多得了)

CF1254D

焯 (我写这题的时候一直在喊焯)

经历了 2 次看错题意之后,终于理解了正确题意,并通过牛逼的乱搞做法 4663ms 通过了这题(时限 5s)哈哈哈哈我是傻逼

首先这题跟概率期望卵关系没有

你大概就是无脑分类讨论一下每类点的贡献吧

比较难搞的是对于一个点,它的每棵子树的贡献都不同

那么对于这种点根号分治

如果这个点的度 B,就直接枚举儿子模拟

如果这个点的度 >B ,这种点的个数不会很多,就把这个点扔进一个集合里,每次 query 的时候枚举更新贡献就行了

B=nlogn 最优

这好像是标算的时间复杂度

据说有 O(nn) 甚至 O(nlogn) 的牛逼做法,我滚去学习一波

哦大概懂了 O(nlogn) 的做法

就是其他的不变,你发现瓶颈在于对度数根号分治

那你可以考虑树剖,然后对于一个点,只更新重儿子,同时在当前节点打个 tag

那么查询的时候,第一种情况是直接在重链上就搞定了,第二种情况是到链顶,查一下链顶的 father 的贡献

ntf nb !!!

2022.1.19

怎么做题速度越来越慢啊,这个壬是不是要凉了 /kk

CF351D

对于一个区间的答案,要么是这个区间的颜色个数,要么是颜色个数+1

取决于第一次操作能不能完整地干掉一个颜色,即有没有颜色形成等差数列

那么可以考虑对于每个点,递推计算它往左形成等差数列的同颜色点最远到哪里

直接 query 区间 min 就行了

至于区间颜色个数,我会莫队

CF487D

nxt(i,j) 表示从 (i,j) 出发,会从 (i,nxt(i,j)) 跳出第 i 行这玩意随便预处理,顺便判个无解(

然后你觉得非常牛逼,就把 n 行合成一块

nxt2(i,j) 表示从 (i,j) 出发,会从 (i+B,nxt2(i,j)) 跳出来

修改暴力 rebuild 就行了

CF452F

尝试乱搞失败(

考虑正解

把当前的值域序列看成一个 01 串,从左往右扫,已经出现的为 1,没有出现的为 0

那么对于值 v ,它不会被包的充要条件是以它为中心是个回文串

然后你有一万种方法维护回文(

CF1344D

我草草草牛逼题,不过并不想写代码(

对于 i,设当前 bix,则给 bi+1 的增量是 ai3x23x1

容易发现,这个增量是单调递减的

那么你可以二分一个整数 mid,然后对于每个 i ,把增量 mid 的操作次数都加上,判断是否超过 k

你可以二分出一个最大的 mid

但注意此时操作次数和并不一定等于 k,你对于剩下的几个可以接受的操作次数,拿个堆模拟一下就可以了

CF827E

根据牛逼结论,循环节 =nnxtn

那么只要计算合法的 nxtn 就可以了

那么只要计算前 len 个和后 len 个是否相等就可以了

那么只要 i[1,len],si=snlen+i 就可以了

那么你可以维护两个数组,一个表示它为 V,一个表示它为 K,卷积,查询是否合法就可以了

还要注意要求是 nxtn ,所以还要枚举倍数 check 一遍

2022.1.20

昨天晚上被 SAM 折磨了。好在会了,现在神清气爽 /hanx。

老年选手觉得自己的博客要注意语言规范,所以我要加句号。

LOJ2033

裸题吧,len(i)len(fa(i))

LOJ2102

泪目,一早上终于把这题过了。

考虑一个点的出现次数,它的意思是从源点经过一堆边,到达这个点的次数。注意,并不需要从这个点往外出边。那么加入一个新的字符的时候,显然是枚举它的每个后缀,然后更新。这一部分可以建出 parent tree 之后搞出来。

然后考虑 T=0 的情况。设 fu 表示从 u 开始,不算空串的方案数。这玩意可以在 DAG 上 dp。至于 T=1 ,就是出现次数不同而已。

我现在对 SAM 也不是很懂,不太理解。

CF235C

这题用了几个小 trick。

第一个是对于一个字符串的循环移位串,可以把他的前 n1 个字符复制一遍,贴在原串后面。这样形成了一个长度为 2n1 的串,它的每个长度为 n 的串都是原串的循环移位串。

第二个是 SAM 上的性质。要注意,一个字符串在 SAM 上跑,在后面新加进一个字符的时候,要一直跳 fa 直到有这个字符的出边。当前跑到 u 节点的意思是,有最长的 t,满足 [rt,r] 这个子串在模式串中出现过,这个子串的 endpos 集合跟 uendpos 集合相同。这个要好好体会。

第三个是,因为在 SAM 上跑的是后缀,所以它是支持删除第一个字符的。具体的操作是,直接 len,然后判断一下跟 parent tree 树上的 falen 是否相等。

LOJ3018

比较的裸吧。

首先按照套路,求出每个点的出现次数(其实就是 endpos 大小)。

然后你发现如果这个点的出现次数为 k,那么它的贡献是连续的,即从 minlen(x)len(x) 都加 k

随便哪个啥玩意维护都行。

CF1207G

老年选手口胡出了一个排序乱搞之后 SAM+LCT 的神奇做法。

老年选手发现这题居然还能用 AC 自动机做。

老年选手表示今天好困,不想思考。

老年选手想等自己状态好点再看这题。

CF961F

感觉这题直接哈希硬草就行了啊。 upd :傻逼老年选手又假了。

如果 S1...kTiborder,那么 S2...k1 一定是 Ti1border

所以答案的增量很小。

那么直接递推就可以了。

2022.1.21

CF616F

看到这题,首先想把一坨串拼在一起,建个 SAM。串之间要分割怎么办呢,加个特殊字符。特殊字符怎么处理呢。我会 拓扑序SPFA$^&!@#@#%!!@#@ 。

然后疯狂 WA。

然后 zjr 说这玩意叫广义 SAM。

然后我去学了一下。学会了 bfs 建广义 SAM。

然后再写了一发,又疯狂 WA。

我写你🐎呢。

CF524F

毛估估猜了个结论,任何左括号右括号个数相等的括号序列,都可以通过循环移位变成合法的。

老年选手口胡了一波。

如果要加左括号,就在最前面加。如果要加右括号,就在最后面补。

可以找出所有的能当首位的位置,然后 SA 把其中字典序最小的搞出来。

那就无了。(吧)。

看了一发题解,感觉老年选手的做法很有道理!

CF547E

哈哈哈我终于做到 2800 了,可喜可贺(。

老年选手口胡了一波。

把这些串按照 SA 的流氓做法拼起来。

那么对于一个子串,他被 call 到的方案数可以通过在 height 上二分求出来。

之后就是处理 l,r 的限制了。

我感觉很可以莫队的样子。但是毛估估一发复杂度有可能被卡常。

把区间离线下来,拆成两个前缀,然后主席树?看起来很可做的样子。

我写你🐎呢。

哦我 sb 了,这就是个二维数点,那就随便做了 /hanx 。

我草,翻了洛谷的题解区,居然有一车壬用 AC 自动机做。我果然是 SA,SAM,ds 学傻了 /kk 。

CF10D

这是个🔨的 2800。

O(n3) 跑的飞快。

O(n2) 也不难。

欺骗我感情。

CF19D

啊哈哈哈我会二维线段树。

哦其实可以用 stl 把里面那颗线段树去掉。

不过这题不要脑子就对了。

CF555E

老年选手来口胡一波。

首先如果它有个环,那他随便分方向。

所以把边双都扬了。

最后它会变成一棵树。

然后在树上的定向操作,你@#$(%#&*(#%&^一下就做完了。

不过老年选手可能要复习一下边双怎么写。

CF1039D

哈人,俺的 friends 里有 5 个做了这题。真的哈人。

首先你有一个牛逼贪心方法。

然后你考虑答案的分布。

你就可以根号分治。

然后你就写代码。

然后我发现递归跟非递归写法常数差个 9 倍。

哈人,真的哈人。

CF1375G

这又是一个杂题选讲讲过的题(。

黑白染色,下界是 min colcnt1

这个下界是可以取到的。因为总有一个点的两端和它不同色。

CF1442D

emm sb zsh 又假了!!!!!!

有个牛逼结论,必然只有一个数组没有被取满。

考虑反证法,第 p 个数组取到 tp,第 q 个数组取到 tq,且 ap,tp+1aq,tq+1

那么从 p 中抽 k 个,到 q 里面。

Δ=i=1kaq,tq+kap,tpi+10

所以是更优的。

那么答案就是 第 i 个数组 跟 不选第 i 个数组的其他整个数组的最优方案 做一个背包。

那么后者可以通过分治解决。

具体的实现方法就是

data tmp = dp;
update(l,mid); solve(mid+1,r);
dp=tmp;
update(mid+1,r); solve(l,mid);

CF163E

感觉建出 AC 自动机,然后在 fail 树上乱做就可以了啊。

这又为什么 2800 啊。

posted @   ZSH_ZSH  阅读(100)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示