随笔分类 -  题解

摘要:口胡一发。 把 $s,t$ 扔一起建后缀数组,扫描线一下得出 $s$ 的每一个后缀和 $t$ 的 LCP 长度(以第 $i$ 个字符开始的记为 $lcp_i$),然后答案就是 $\max\limits^r_{i=l}\min(lcp_i,r-i+1)$,显然离线一下,根据 $i+lcp_i$ 和 $ 阅读全文
posted @ 2020-07-08 16:10 wangyuchen 阅读(145) 评论(0) 推荐(0)
摘要:首先,每个结点都是独立的,所以不妨分开计算贡献。 按照去年的套路,我们定义 $P_o$ 为 $o$ 上有标记的概率,$P_f$ 为 $o$ 及其祖先上有标记的概率,同时记 $o$ 控制的区间为 $[L,R]$,$o$ 的父亲的为 $[l,r]$(可以避免对左/右儿子的分类讨论),修改区间为 $[x, 阅读全文
posted @ 2020-07-08 15:54 wangyuchen 阅读(214) 评论(0) 推荐(0)
摘要:不得不说,ZJOI 的可做题都是数据结构题 这个东西显然不能在线,所以考虑离线以后从左往右扫过去。同时询问可以把整棵树处理好再处理。 那么我们要处理的就是修改生长结点引发的孩子关系变化。 考虑对每个修改开一个虚点,然后每次生长出的点挂在最近的修改下,相邻修改前后相连,不难发现这种连法像多叉转二叉一样 阅读全文
posted @ 2020-04-21 10:44 wangyuchen 阅读(144) 评论(0) 推荐(0)
摘要:为什么你们都用并查集啊qwq 首先,可以发现每一块的状态都是独立的,所以可以逐块操作,就可以做到 $O(n+m)$ 空间。 对于每一块,对每个 $a_i$ 开一个链表,记录值为 $a_i$ 的数的位置。对于块内修改,把 $a_i$ 还原后暴力重构;对于全局修改,考虑记录 $a_i$ 的最大值 $ma 阅读全文
posted @ 2020-04-11 10:02 wangyuchen 阅读(210) 评论(0) 推荐(0)
摘要:考虑以时间为下标,数组下标从 $n$ 至 $1$ 扫描,那么 $a_i$ 在 $t_1-t_2$ 时刻的值为 $val$ 对应的修改应为对 $t_1-t_2$ 区间取 $\min$。而查询操作对应的就是查询 $t$ 这个位置被更新了多少次。 考虑势能线段树维护。因为不同的 $val$ 不超过 $n+ 阅读全文
posted @ 2020-04-07 10:13 wangyuchen 阅读(393) 评论(0) 推荐(0)
摘要:首先转化一波: 对于1操作,我们求原图的生成树,然后对于每条非树边记下它和树边形成的环,这样的操作共有 $m-n+1$ 个; 对于2操作,我们考虑对于 $n$ 个结点,把和这个结点相连的边状态反转。 不难发现任何操作序列都可以拆成这 $m+1$ 个操作,且显然每个操作最多进行一次,所以只用考虑这 $ 阅读全文
posted @ 2020-04-06 10:36 wangyuchen 阅读(327) 评论(0) 推荐(0)
摘要:考虑多边形最外侧的三角形,可以发现与外侧的点相邻的两条边中必定恰好删除一条。 所以,我们把两条都删掉,然后在三角形内侧的边上打一个标记,表示要恢复一条边。 接下来的处理三角形需要考虑标记,不妨设这个三角形为 $(u,w,v)$($w$ 为外侧点),分类讨论: $(u,w)$ 与 $(w,v)$ 都有 阅读全文
posted @ 2020-04-06 10:09 wangyuchen 阅读(291) 评论(0) 推荐(0)
摘要:长链剖分模板?在每个链顶开一个 vector 记录,合并链的时候每加一次更新一下这条链的答案就可以了。 不得不说 vector 的空间常数好大啊 #include<cstdio> #include<vector> #define For(i,A,B) for(i=(A);i<=(B);++i) #d 阅读全文
posted @ 2020-03-30 12:33 wangyuchen 阅读(166) 评论(0) 推荐(0)
摘要:求一个联通图的独立集个数(包括空集) 对于树的情况,记 $dp_{u,0/1}$ 为以 $u$ 为根的子树在不选/选 $u$ 时的独立集数量,转移方程是显然的: $$dp_{u,0}=\prod\limits_{v\in son_u}(dp_{v,0}+dp_{v,1})$$ $$dp_{u,1}= 阅读全文
posted @ 2020-03-29 21:33 wangyuchen 阅读(220) 评论(0) 推荐(0)
摘要:为了学长链剖分开的题,结果还是忍不住写了个线段树合并 首先不难发现:$b$ 要么是 $a$ 的祖先,要么是 $a$ 的后代。 $b$ 是 $a$ 的祖先很好弄,因为 $c$ 的数量始终等于 $size_a-1$;对于 $b$ 要么是 $a$ 的后代的情况,那么就是求 $a$ 的子树中和它深度差不超过 阅读全文
posted @ 2020-03-15 12:50 wangyuchen 阅读(208) 评论(0) 推荐(0)
摘要:upd: 它掉出 Ynoi 了,有时间了更几个真正的 Ynoi 吧。 Ynoi难得的很好写的题。主要考察两角和公式: $\sin(\alpha+\beta)=\sin\alpha\cos\beta+\cos\alpha\sin\beta$ $\cos(\alpha+\beta)=\cos\alpha 阅读全文
posted @ 2020-03-14 08:40 wangyuchen 阅读(270) 评论(0) 推荐(0)
摘要:首先考虑一下:如果我们知道要买(或送)哪几袋米,如何确保自己的钱够用? 显然应该买最便宜的几个,剩下的送。 所以我们可以枚举一个$p$,比$p$便宜的米用买的方式,比$p$贵的米用送的方式,不会遗漏最优解。把米按价格排序用背包就可以做到$O(n^2m)$。 #include<cstdio> #inc 阅读全文
posted @ 2020-03-03 10:03 wangyuchen 阅读(182) 评论(0) 推荐(0)
摘要:首先把 $a$ 排序。不难发现只有两种可能方案:把所有数改成 $a_n$,改成不小于 $a_n$ 的第一个质数。 对于每个数,把它改成大于它的第一个质数,再改成第二个……这些过程可以拆开来放在一起,对于短于 $\frac{c_2}{c_1}$ 的区间用第一种方案,更长的用第二种。 一些细节:如果 $ 阅读全文
posted @ 2020-02-16 16:02 wangyuchen 阅读(192) 评论(0) 推荐(0)
摘要:(在接下来的描述和图片中,用$dis_u$表示根(1号点)到$u$的路径的边权和;$[l,r]$范围内的点用蓝色表示,$p$用红色表示) 我们考虑$lca_{l,l+1,\cdots,r}$(以下记为$lca$,用橙色表示),有以下情况: 1.$lca$为$p$的孩子(或$p$) 这表明$[l,r] 阅读全文
posted @ 2020-02-10 14:41 wangyuchen 阅读(175) 评论(0) 推荐(0)
摘要:首先研究一下subtask 5怎么搞。 手玩一下不难发现:满足总和为$2m-2$且每个数不小于1的数列都是满足要求的。这就给了我们启发:可不可以直接找出度数序列数量呢? 接下来解决一个问题:$n$个结点的仙人掌最多有几条边? 不难发现,所有包含点数大于4个的环都是不优的,例如5个点的环可以改成6条边 阅读全文
posted @ 2020-02-10 13:54 wangyuchen 阅读(283) 评论(0) 推荐(0)
摘要:莫队之集大成者——树上带修改莫队。 首先对树dfs,记下进入和离开一个结点的时间戳$in_u$,$out_u$,并得到相应的长为$2n$的dfs序(常称为括号序),对于一个询问$(u,v)$: 若$lca_{u,v}=u$,则$in_u$到$in_v$之间$(u,v)$路径上的点恰好出现一次,其他点 阅读全文
posted @ 2019-08-28 14:33 wangyuchen 阅读(151) 评论(0) 推荐(0)
摘要:显然k条数据线不会交叉。因此可以把问题转化为:从n-1个区间中选择k个,选出的区间不能相邻,最小化区间长度和。 这个贪心和种树是一样的,只不过1和n-1不相邻,两边放上inf值作边界即可。 #include<cstdio> #include<queue> using namespace std; c 阅读全文
posted @ 2019-08-27 14:35 wangyuchen 阅读(164) 评论(0) 推荐(0)
摘要:一个显然的错误贪心是每次取最大值。 这个贪心的问题在于取最大值两侧的元素可能比取最大值更优,因此取出最大值后,删掉它两侧的元素,在最大值位置插入一个权值为两侧元素和-最大值的结点,这个可以用双向链表维护,这样的话,选这个元素相当于选了两侧元素,放弃了最大值(由于最大值不可能再被选了,放弃不会丢失最优 阅读全文
posted @ 2019-08-27 14:10 wangyuchen 阅读(152) 评论(0) 推荐(0)
摘要:因为$a_i+x,b_i+y$和$a_i+(x-y),b_i$是等价的,所以只需讨论给$a_i$加上一个$[-m,m]$的数即可。 对于题目中的式子: $$\begin{aligned}\sum\limits^n_{i=1}(a_i+x-b_i)^2&=\sum\limits^n_{i=1}(a_i 阅读全文
posted @ 2019-08-27 13:25 wangyuchen 阅读(127) 评论(0) 推荐(0)
摘要:这里是点名被卡的$O(qnlogm)$做法 首先考虑对于两个串$s$和$t$,我们怎么合并得到$ans$(两天的总状态): 1. 若存在$s_i$,$t_i$分别为0,1,则返回无解;2. 若$s_i=t_i$,则$ans_i=s_i$(这里涵盖了$s_i=t_i=?$的情况);3. 否则,$s_i 阅读全文
posted @ 2019-08-26 15:15 wangyuchen 阅读(188) 评论(0) 推荐(0)