ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

做题记录——1.15-1.21

2022-01-21 22:05:22  阅读:162  来源: 互联网

标签:1.15 记录 然后 这题 那么 括号 就行了 1.21 dp


2022.1.15

CF1601D

神仙贪心题

CF367E

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

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

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

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

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

1 啥也不放

2 放了一个左括号

3 放了一个右括号

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

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

CF356D

最后会搞出来一个森林

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

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

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

综上所述,这是一道烂题

CF1292D

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

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

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

CF1295F

这题跟 APIO 那题挺像的

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

考虑离散化值域,设 \(f_{i,j}\) 表示前面 \(i\) 个数,第 \(i\) 个在值域 \(j\) 的方案数

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

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

CF1179D

wdnmd WA 11,怒抄代码

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

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

2022.1.16

CF1617E

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

你就直接连边,你发现每个点至多连 \(\log a_i\) 条边

然后搞出来一棵树

然后就无了啊

CF578D

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

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

那么答案就是 段数\(*n*(m-1)\)

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

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

CF1408G

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

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

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

CF1453F

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

1453好

你大力考虑 \(dp_{i,nxt}\) 表示从 \(i\) 开始,下一步跳到 \(nxt\) 的最小代价

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

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

CF500F

每个物品上架持续时间相等,那么我们每次询问的区间就是 \([a_i-p,a_i]\) 之间上架的物品

把时间轴分成 \(L \over p\) 份,每份之间有一个关键点

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

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

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

CF1146G

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

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

显然套路地拆点,把 \(i\) 拆成 \(i_0,i_1\cdots i_h\)

\(S\) 连向 \(i_0\),\(i_h\) 连向 \(T\) ,容量 \(inf\)

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

所以 \(i_j\) 向 \(i_{j+1}\) 连容量为 \(h^2 - j^2\) 的边,表示建高度为 \(j\) 的楼

再考虑罚金,每个询问建一个新点 \(p\),对于 \(i \in [l,r]\),连边 \(i_{x+1} \rightarrow p\) ,容量为 \(inf\)

然后连边 \(p \rightarrow T\),容量 \(c\)

直接跑一发最小割就好了

CF48G

我又双叒叕假了

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

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

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

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

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

两边的操作类似

对于左边,显然有

\[f_u = \sum_{v\text{可以走左边}} dp_v+dis(u,v) \times size_v \]

那么 \(\sum dp_v\) 比较好求,右边那项不是特别好求

你考虑把 \(dis(u,v)\) 拆开,因为在环上,变成 \(s_v - s_u\)

就可以前缀和优化了 /hanx

CF494D

把式子转化成

\[f(u,v) = 2\sum_{x \in S(v)} d(u,x)^2 - \sum_{i=1}^n d(u,i)^2 \\ = 2 \sum_{x \in S(v)} d(u,x)^2 - dp_u \]

先考虑式子的前半部分

记 \(lca = lca(u,v)\)

对于 \(dep_w \leq dep_{lca}\) 的 \(w\),设 \(d_1 = dis(u,lca),d_2 = dis(v,lca)\)

\[\begin{aligned} d(u,w)^2 & = (d(v,w)-d_2+d_1)^2\\ & = d(v,w)^2 + d_1^2+d_2^2-2d(v,w)d_2+2d(v,w)d_1-2d_2d_1 \end{aligned} \]

那么这玩意比较好做

对于 \(dep_w > dep_{lca}\) 的 \(w\),设 \(d_0 = dis(u,v)\)

\[\begin{aligned} d(u,w) ^ 2 &= (d_0-d(v,w))^2\\ & = d_0^2 + d(v,w)^2 - 2d_0d(v,w) \end{aligned} \]

长得就很能做

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

没了吧(

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

2022.1.17

早上打了场比赛,390 分

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

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

CF1034C

哦哦哦牛逼题

你思考一下,对于分成 \(k\) 个联通块,每个连通块的价值就是 \(S \over k\)

那么 \((u,fa_u)\) 这条边 cut 的必要条件就是 \(sum_u \equiv 0 \pmod {{S \over k}})\)

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

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

那么对于一个 \(k\),它可以由 \(k = td\) 的 \(d\) 转移过来,再容斥一波

没了

CF1000G

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

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

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

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

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

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

甚至还是线性的(?

2022.1.18

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

CF715C

艹差点被这题诈骗到了

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

然后没得了

CF906D

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

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

随便 \(merge\) 吧

无了

CF1270G

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

因为 \(i-n \leq a_i \leq i-1\),所以 \(1 \leq i-a_i \leq n\)

那么从 \(i\) 向 \(i-a_i\) 连边

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

考虑这个森林里的任意一个环,有 \(i = i+ \sum-a_i\)

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

CF1370F2

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

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

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

你考虑二分这个深度,每次询问 \(dep_{mid}\) 这个集合里的点

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

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

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

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

有一个小的优化:较深的点的深度一定 \(\geq {l \over 2}\),这样就能让二分次数减少一次,就能水过去了(

CF1458C

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

这题是学诚还是学信讲的

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

然后就是普及组模拟题(

CF713D

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

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

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

这玩意你二分一个 \(d\),然后就 check \(f_{i,j+1} \geq d-1,f_{i+1,j} \geq d-1,a_{i+d-1,j+d-1}\) 就行了

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

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

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

CF1254D

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

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

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

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

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

那么对于这种点根号分治

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

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

取 \(B = \sqrt{n\log n}\) 最优

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

据说有 \(O(n\sqrt n)\) 甚至 \(O(n \log n)\) 的牛逼做法,我滚去学习一波

哦大概懂了 \(O(n \log n)\) 的做法

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

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

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

ntf nb !!!

2022.1.19

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

CF351D

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

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

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

直接 query 区间 min 就行了

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

CF487D

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

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

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

修改暴力 rebuild 就行了

CF452F

尝试乱搞失败(

考虑正解

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

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

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

CF1344D

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

对于 \(i\),设当前 \(b_i\) 为 \(x\),则给 \(b_i + 1\) 的增量是 \(a_i - 3 x^2 - 3 x - 1\)

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

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

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

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

CF827E

根据牛逼结论,循环节 $ = n - nxt_n$

那么只要计算合法的 \(nxt_n\) 就可以了

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

那么只要 \(\forall i \in [1,len] ,s_i = s_{n-len+i}\) 就可以了

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

还要注意要求是 \(nxt_n\) ,所以还要枚举倍数 check 一遍

2022.1.20

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

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

LOJ2033

裸题吧,\(\sum {len(i)-len(fa(i))}\)。

LOJ2102

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

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

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

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

CF235C

这题用了几个小 trick。

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

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

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

LOJ3018

比较的裸吧。

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

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

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

CF1207G

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

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

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

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

CF961F

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

如果 \(S_{1...k}\) 是 \(T_i\) 的 \(border\),那么 \(S_{2...k-1}\) 一定是 \(T_{i-1}\) 的 \(border\)。

所以答案的增量很小。

那么直接递推就可以了。

2022.1.21

CF616F

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

然后疯狂 WA。

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

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

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

我写你

标签:1.15,记录,然后,这题,那么,括号,就行了,1.21,dp
来源: https://www.cnblogs.com/ZHANG-SHENG-HAO/p/15831916.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有