随笔分类 -  各省省选

摘要:题面 需要动态维护一个点集的极小联通子图边权和。可以发现,将点集 \(\{a_i\}\) 中的点按照 dfs 序从小到大排序之后,\(dist(a_1,a_2)+dist(a_2,a_3)+\ldots+dist(a_{k-1},a_k)+dist(a_k,a_1)\) 恰好等于我们要维护的那个边权 阅读全文
posted @ 2022-05-20 12:08 cunzai_zsy0531 阅读(32) 评论(0) 推荐(0)
摘要:题面 首先求出原数组的前缀 xor 数组 \(s\),这样相当于要在其中找两个值使其 xor 起来最大。 维护一个堆,里面有 \(n\) 个元素,分别为当前与 \(s_i\) 异或最大的数。每次取出来一个就把与当前这个 \(s_i\) 异或次大的数放进去,以此类推即可。使用类似线段树二分的方法可以做 阅读全文
posted @ 2022-05-20 12:02 cunzai_zsy0531 阅读(54) 评论(0) 推荐(0)
摘要:题面 罕见的数位dp好题。 首先感觉这个题想数位dp有点困难,很多东西都在变。注意到每个数位数字和其实最大也才一百多,考虑枚举这个和,统计被这个和整除且数位和等于这个和的数的个数就完事了。 点击查看代码 #include<iostream> #include<cstdio> #include<cst 阅读全文
posted @ 2022-05-20 11:54 cunzai_zsy0531 阅读(30) 评论(0) 推荐(0)
摘要:题面 这题很有意思,正解做法是线段树优化建图之后跑tarjan强连通分量然后在DAG上做一些奇奇怪怪的统计,但是这题有神仙 \(O(n)\) 做法!(虽然我不会证明但是跑的的确很快啊) 说的是,首先注意到先点一个,最后爆炸的炸弹一定是一个区间。所以现在问题转化成了对于每个 \(i\) 求爆炸的左右端 阅读全文
posted @ 2022-05-19 16:58 cunzai_zsy0531 阅读(27) 评论(0) 推荐(0)
摘要:题面 dp有后效性,转移看作边之后会成环。这时候一般需要建出图来跑最短路。 这道题的最短路有些不一样,方程为 \(f_i=\max(a_i,b_i+\sum\limits_j f_j)\),比较像最短路的松弛操作。spfa每次从队列里取出 \(u\) 来之后,遍历所有相邻点 \(v\),记录一个和, 阅读全文
posted @ 2022-05-19 16:51 cunzai_zsy0531 阅读(24) 评论(0) 推荐(0)
摘要:题面 看起来就很像是一道数位dp,\(L\) 和 \(R\) 很大,并且限制和大小没关系。考虑状态的设计:剩余长度 \(len\),是否有上限限制 \(lim\),这两个肯定是必须的。因为要统计连续三个位置相同,所以要记录 \(pre1,pre2\) 表示前两位是什么数(当然也可以记录上一位和它们两 阅读全文
posted @ 2022-05-19 16:49 cunzai_zsy0531 阅读(46) 评论(0) 推荐(0)
摘要:题面 前两个操作放过来看似是一道线段树题,但是发现线段树无法维护第三个操作。考虑使用平衡树(fhqtreap)来解决这个问题,前两个操作和线段树差不多,直接split出来打加法和乘法标记即可。第三个操作大概就是把 \(R\) 位置的系数加到 \(R+1\) 位置并且删除,在 \(L\) 的左边加一个 阅读全文
posted @ 2022-05-19 16:37 cunzai_zsy0531 阅读(34) 评论(0) 推荐(0)
摘要:题面 考虑把操作时间当作下标建立线段树,每次操作要么是单点修改为 \(x\),要么是修改为 \(1\)。输出答案就是输出线段树根节点的答案。 点击查看代码 #include<iostream> #include<cstdio> using namespace std; const int N=1e5 阅读全文
posted @ 2022-05-19 16:24 cunzai_zsy0531 阅读(20) 评论(0) 推荐(0)
摘要:题面 这个题相当于是把每个数的值作为 \(x_i\),在原序列中的位置为 \(y_i\),建出笛卡尔树,直接输出先序遍历(字典序最小)即可。 点击查看代码 #include<iostream> #include<cstdio> using namespace std; inline int rd() 阅读全文
posted @ 2022-05-19 16:13 cunzai_zsy0531 阅读(27) 评论(0) 推荐(0)
摘要:题解 李超树维护直线,求单点最值。维护线段和直线的区别是,线段只是对一段区间有贡献,在线段树上这一段区间需要对应 \(O(\log n)\) 个节点,然后再往下传 \(O(\log n)\) 次,所以复杂度是两个 \(\log\) 的。直线只需要对整个区间进行这个操作,复杂度是 \(1\log\)。 阅读全文
posted @ 2022-05-19 16:10 cunzai_zsy0531 阅读(42) 评论(0) 推荐(0)
摘要:题面 基本上所有树剖题都可以用LCT维护。两种思路,一种是直接暴力地维护每个点表示的区间的左右端点颜色和颜色段数,另一种是把连接同种颜色的边边权设为 \(0\),不同种颜色设为 \(1\),然后维护路径和即可。 一个注意的点在于LCT中的 \(tag\) 是对所有跟左右有关的值进行取反的标记。一定不 阅读全文
posted @ 2022-05-18 21:49 cunzai_zsy0531 阅读(23) 评论(0) 推荐(0)
摘要:题面 把所有叶子拎起来当根,合并成一棵trie之后建广义 SAM(我直接每个叶子直接跑的,每次 \(lastpos\) 重置,也可过)。 点击查看代码 const int N=1e5+13,M=2e6+13; int n,m,nxt[M<<1],len[M<<1],ptot=1; std::vect 阅读全文
posted @ 2022-05-18 21:25 cunzai_zsy0531 阅读(36) 评论(0) 推荐(0)
摘要:题面 对 \(T\) 建 SAM,拿 \(S\) 进去跑,可以得到每个 \(S\) 的前缀 \(S_i\) 的最长匹配后缀长度 \(sl_i\)。那么对于一个询问 \([l,r]\),答案就是 \(\max_{l\leq i\leq r}\{\min(sl_i,i-l+1)\}\)。 里面这个 \( 阅读全文
posted @ 2022-05-18 21:08 cunzai_zsy0531 阅读(28) 评论(0) 推荐(0)
摘要:题面 拿出出现次数为 \(k\) 的点,给这个点表示的长度区间 \(+1\),这个可以使用差分解决。 点击查看代码 const int N=1e5+13; char s[N]; int nxt[N<<1],len[N<<1],ptot,lastpos,ind[N<<1]; ll cnt[N<<1], 阅读全文
posted @ 2022-05-18 21:01 cunzai_zsy0531 阅读(56) 评论(0) 推荐(0)
摘要:题面 当年见这题的时候还是初三的年轻选手。现在已经是老选手了…… 考虑推式子: \[ \begin{aligned} &\ \ \ \ \ \sum_T (\sum_{i=1}^{n-1}w_{e_i})\times\gcd_{i=1}^{n-1}w_{e_i}\\ &=\sum_T \big(\s 阅读全文
posted @ 2022-05-18 20:35 cunzai_zsy0531 阅读(21) 评论(0) 推荐(0)
摘要:题面 板子。注意模数不是质数的 \(\det\): inline int det(int n){ int res=1;bool flag=0; for(int i=1;i<=n;++i) for(int j=i+1;j<=n;++j){ while(a[i][i]){ int tmp=a[j][i] 阅读全文
posted @ 2022-05-18 20:31 cunzai_zsy0531 阅读(21) 评论(0) 推荐(0)
摘要:题面 这题挺有意思的。平常的矩阵树定理求的是 \[ \sum_T\prod_{e\in T}w_e \] 这题要求 \[ \begin{aligned} \sum_T\prod_{e\in T}p_e\prod_{e\not\in T}(1-p_e) &=\sum_T(\prod_{e\in T}p 阅读全文
posted @ 2022-05-18 20:29 cunzai_zsy0531 阅读(27) 评论(0) 推荐(0)
摘要:题面 模板题。直接容斥+矩阵树。复杂度 \(O(2^{n-1}(n-1)^3)\) 可以通过。 阅读全文
posted @ 2022-05-18 20:28 cunzai_zsy0531 阅读(13) 评论(0) 推荐(0)
摘要:题面 一个显然的做法是树剖之后dfs序线段树套时间线段树,直接做的复杂度是 \(O(n\log^3 n)\)。其实也可以把询问离线下来,做一个线段树分治,用树套树维护。 这样做比较麻烦,所以考虑另外一种思路:二分答案。因为有很多询问,不妨放在一起二分,所以可以想到整体二分。使用类似树上差分的思想,对 阅读全文
posted @ 2022-05-18 20:26 cunzai_zsy0531 阅读(34) 评论(0) 推荐(0)
摘要:题面 设 \(sum_u\) 为 \(u\) 子树内 \(d\) 的和,\(sum_d\) 和 \(sum_ch\) 意义是常见点分树容斥,记录子树内 \(d\times dist\) 的和。 首先注意一个性质:假设当前答案为 \(u\),那么如果 \(u\) 的某个儿子 \(v\) 的答案更优,那 阅读全文
posted @ 2022-05-11 18:56 cunzai_zsy0531 阅读(45) 评论(0) 推荐(0)