BZOJ 4530 LCT/线段树合并】的更多相关文章

//By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ; ],lson[N*],rson[N*]; int first[N],next[N],v[N],w[N],tot,root[N],fa[N],deep[N],f[N]; ];}node[N]; void dfs(int x){ dfn[x]=++cnt; for(int i=firs…
线段树合并的板子题,每次从下到上合并就完事了 // by Isaunoya #include <bits/stdc++.h> using namespace std; #define rep(i, j, n) for (int i = j; i <= n; i++) #define in cin #define out cout #define pii pair<int, int> #define fir first #define sec second int n, m;…
hhhh抄了半天lty代码最后T了  对拍也没事.. 药丸 mine #pragma GCC optimize("O3") //By SiriusRen #include <bits/stdc++.h> using namespace std; ; typedef long long ll; ],v[N*],tot; ],cnt,lazy[N*]; ],rev[N],q[N],top,root; ll sum[N*];]; void add(int x,int y){v[t…
题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换左右子树无关,是否交换左右子树取决于交换后 “跨越 x 左子树与右子树的逆序对” 是否会减小. 因此我们要求出两种情况下的逆序对数,使用线段树合并,对每个节点建一棵线段树,然后合并的同时就求出两种情况下的逆序对. 代码 #include <iostream> #include <cstdli…
BZOJ 注意\(c\leq7\)→_→ 然后就是裸的权值线段树+线段树合并了. 对于取\(\max/\min\)操作可以直接区间修改清空超出范围的值,然后更新到对应位置上就行了(比如对\(v\)取\(\max\),把\(\lt v\)的数全删掉,统计一下个数\(num\),然后在\(v\)处加上\(num\)个\(v\)即可). 值域很大,直接维护区间乘积会炸,只能取对数. 最好还是先离散化一下. 复杂度\(O(m\log V)\). 注意线段树合并Merge的时候不要写Update/Push…
BZOJ LOJ 令\(f[i][j]\)表示以\(i\)为根的子树,权值\(j\)作为根节点的概率. 设\(i\)的两棵子树分别为\(x,y\),记\(p_a\)表示\(f[x][a]\),\(p_a'\)表示\(f[y][a]\),\(P_i\)表示给定的\(i\)取最大值作为权值的概率. 转移就是两棵树之间的权值组合,即以\(x\)子树中的\(a\)作为最小值的概率为\(p_a\times\sum\limits_{v>a}p_v'\times(1-P_i)\),以\(x\)子树中的\(a\…
BZOJ 洛谷 \(dsu\ on\ tree\).(线段树合并的做法也挺显然不写了) 如果没写过\(dsu\)可以看这里. 对修改操作做一下差分放到对应点上,就成了求每个点子树内出现次数最多的颜色,这就和CF600E类似了.直接用\(dsu\). 修改某个颜色出现次数的时候,最大值不能\(O(1)\)求出,得套个\(set\),所以复杂度是\(O(q\log^2n)\).但常数并不大. 关于复杂度,在CF600E中对一个点的修改是\(O(1)\)的,而本题中可能是\(O(q)\)(一个点上挂着…
BZOJ 洛谷 \(Description\) 给定一棵树,每次询问给定\(p,k\),求满足\(p,a\)都是\(b\)的祖先,且\(p,a\)距离不超过\(k\)的三元组\(p,a,b\)个数. \(n,q\leq3\times10^5\). \(Solution\) \(p,a,b\)都在一条链上. 那么如果\(a\)是\(p\)的祖先,答案就是\(\min(dep[p],\ k)*(sz[p]-1)\).可以\(O(1)\)计算. 如果\(a\)在\(p\)的子树中,答案就是\(\sum…
LOJ 洛谷 BZOJ 考虑\(l=1,r=|S|\)的情况: 对\(S\)串建SAM,\(T\)在上面匹配,可以得到每个位置\(i\)的后缀的最长匹配长度\(mx[i]\). 因为要去重,对\(T\)也建SAM,计算上面所有节点的答案.记\(pos[i]\)表示\(i\)节点第一次出现的下标(同一节点代表的串出现的位置集合相同,所以随便记一个即可). 则节点\(i\)的答案为:\(\max(0,\ len[i]-\max(len[fa[i]],\ mx[pos[i]]))\). 考虑\(l,r…
标签那么长是因为做法太多了... 题目链接: (bzoj 3277) https://www.lydsy.com/JudgeOnline/problem.php?id=3277 (bzoj 3473) https://www.lydsy.com/JudgeOnline/problem.php?id=3473 题解: 先讲三个做法公共部分: 建出广义SAM,然后对于每个点求出它在多少字符串中出现过. 做法一 把每个字符串在广义SAM上暴力跑.每跑到一个点就暴力沿着fail树往上跳,标记跳过的点,直…