洛谷P1501 Tree II】的更多相关文章

LCT 还是LCT的板子,下放标记和那道线段树2一样,先放乘..之前用char忘记getchar,调了好久... 注意开long long!! #include <bits/stdc++.h> #define INF 0x3f3f3f3f #define full(a, b) memset(a, b, sizeof a) using namespace std; typedef long long ll; inline int lowbit(int x){ return x & (-x…
这个题是一个经典的维护路径信息的题,对于路径上的修改,我们只需要把对应的链\(split\)上来,然后修改最上面的点就好,注意pushdown的时候的顺序是先乘后加 然后下传乘法标记的时候,记得把对应的\(add\)标记也要乘,因为就跟线段树的下传标记类似 // luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #i…
P1501 [国家集训队]Tree II 题目描述 一棵\(n\)个点的树,每个点的初始权值为\(1\).对于这棵树有\(q\)个操作,每个操作为以下四种操作之一: + u v c:将\(u\)到\(v\)的路径上的点的权值都加上自然数\(c\): - u1 v1 u2 v2:将树中原有的边\((u_1,v_1)\)删除,加入一条新边\((u_2,v_2)\),保证操作完之后仍然是一棵树: * u v c:将\(u\)到\(v\)的路径上的点的权值都乘上自然数\(c\): / u v:询问\(u…
洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2......(相信各位Dalao一定做过这道题) 这里的维护懒标记方法很像.除了翻转标记以外还要维护乘法标记和加法标记. 根据运算优先级,乘法是要先算的,所以先放,放的时候子树的\(sum\),乘法标记,加法标记,儿子的\(val\)统统都要乘一遍. 放加法标记的时候,想到线段树的区间大小是稳定的,而Splay…
推荐YCB的总结 推荐你谷ysn等巨佬的详细题解 大致流程-- dfs求出当前树的重心 对当前树内经过重心的路径统计答案(一条路径由两条由重心到其它点的子路径合并而成) 容斥减去不合法情况(两条子路径在重心的子树内就已经相交) 删除重心(打上永久标记),对子树继续处理,转1 求重心是板子,算答案的方法要依题而定,一般都要容斥. 模板题洛谷传送门 calc函数中,头尾两个指针扫的计数方法也是一种套路 因为要sort,所以复杂度\(O(n\log^2n)\),不过蒟蒻实测你谷数据\(k\)不超过\(…
题面 有多组数据:Poj 无多组数据:洛谷 题解 点分治板子题,\(calc\)的时候搞一个\(two\ pointers\)扫一下统计答案就行了. #include <cmath> #include <cstdio> #include <cstring> #include <algorithm> using std::min; using std::max; using std::swap; using std::sort; typedef long lo…
题目链接 Tree Ⅱ\(=\)[模板]LCT+[模板]线段树2.. 分别维护3个标记,乘的时候要把加法标记也乘上. 还有就是模数的平方刚好爆\(int\),所以开昂赛德\(int\)就可以了. 我把初始化放在连边的那个循环里了,而那个循环是\(1\)到\(n-1\)的,所以第\(n\)个没初始化到..\(WA\)了好久. #include <cstdio> #include <cstring> #define YCH 51061 #define R register unsign…
题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的边(u1,v1)删除,加入一条新边(u2,v2),保证操作完之后仍然是一棵树: * u v c:将u到v的路径上的点的权值都乘上自然数c: / u v:询问u到v的路径上的点的权值和,求出答案对于51061的余数. 输入输出格式 输入格式: 第一行两个整数n,q 接下来n-1行每行两个正整数u,v,…
题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的边(u1,v1)删除,加入一条新边(u2,v2),保证操作完之后仍然是一棵树: \* u v c:将u到v的路径上的点的权值都乘上自然数c: / u v:询问u到v的路径上的点的权值和,求出答案对于51061的余数. 输入输出格式 输入格式: 第一行两个整数n,q 接下来n-1行每行两个正整数u,v…
题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的边(u1,v1)删除,加入一条新边(u2,v2),保证操作完之后仍然是一棵树: \* u v c:将u到v的路径上的点的权值都乘上自然数c: / u v:询问u到v的路径上的点的权值和,求出答案对于51061的余数. 输入输出格式 输入格式:   第一行两个整数n,q 接下来n-1行每行两个正整数u…
题目大意:给一棵树,有四种操作: $+\;u\;v\;c:$将路径$u->v$区间加$c$ $-\;u_1\;v_1\;u_2\;v_2:$将边$u_1-v_1$切断,改成边$u_2-v_2$,保证数据合法 $*\;u\;v\;c:$将路径$u->v$区间乘$c$ $/\;u\;v:$询问路径$u->v$区间和 题解:$LCT$乱搞 卡点:无 C++ Code: #include <cstdio> #define maxn 100010 #define lc(rt) son[…
看来这个LCT板子并没有什么问题 #include<cstdio> #include<algorithm> using namespace std; typedef long long LL; ; namespace LCT { struct Node { Node *ch[],*fa; bool rev; LL addv,mulv; LL dat,sum,sz; void padd(LL x) { addv=(addv+x)%md;dat=(dat+x)%md;sum=(sum+…
Link-Cut-Tree 的懒标记下传正确食用方法. 我们来逐步分析每一个操作. 1:+ u v c:将u到v的路径上的点的权值都加上自然数c; 解决方法: 很显然,我们可以 split(u,v) 来提取u,v这一段区间,提取完了将 Splay(v),然后直接在v上打加法标记add即可. 代码: inline void pushadd(ll x,ll val){//打标记 s[x]+=sz[x]*val,v[x]+=val,add[x]+=val; s[x]%=MOD,v[x]%=MOD,ad…
Code: #include <cstdio> #include <algorithm> #include <cstring> #include <string> using namespace std; void setIO(string a) { freopen((a+".in").c_str(),"r",stdin); freopen((a+".out").c_str(),"w&qu…
传送门 这是一道LCT的板子题,说白了就是在LCT上支持线段树2的操作. 所以我只是来存一个板子,并不会讲什么(再说我也不会,只能误人子弟2333). 不过代码里的注释可以参考一下. Code #include<bits/stdc++.h> using namespace std; typedef unsigned int uint; ; ; inline int read(){ ,w=;; while(!isdigit(ch)) w|=ch=='-',ch=getchar(); )+(x&l…
题目描述 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K 输入输出格式 输入格式:   N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下来是k   输出格式:   一行,有多少对点之间的距离小于等于k   输入输出样例 输入样例#1:  7 1 6 13 6 3 9 3 5 7 4 1 3 2 4 20 4 7 2 10 输出样例#1:  5 题解:点分裸题,考虑分治中的暴力,将所有的重心子树中的点到中心的距离排序,对于一组l-r之间如果…
P1722 矩阵 II 题目背景 usqwedf 改编系列题. 题目描述 如果你在百忙之中抽空看题,请自动跳到第六行. 众所周知,在中国古代算筹中,红为正,黑为负…… 给定一个1*(2n)的矩阵(usqwedf:这不是一个2n的队列么),现让你自由地放入红色算筹和黑色算筹,使矩阵平衡[即对于所有的i(1<=i<=2n),使第1~i格中红色算筹个数大于等于黑色算筹] 问有多少种方案满足矩阵平衡. 见样例解释. 输入输出格式 输入格式: 正整数 n 输出格式: 方案数t对100取模 输入输出样例…
P1722 矩阵 II 题目背景 usqwedf 改编系列题. 题目描述 如果你在百忙之中抽空看题,请自动跳到第六行. 众所周知,在中国古代算筹中,红为正,黑为负…… 给定一个1*(2n)的矩阵(usqwedf:这不是一个2n的队列么),现让你自由地放入红色算筹和黑色算筹,使矩阵平衡[即对于所有的i(1<=i<=2n),使第1~i格中红色算筹个数大于等于黑色算筹] 问有多少种方案满足矩阵平衡. 见样例解释. 输入输出格式 输入格式: 正整数 n 输出格式: 方案数t对100取模 输入输出样例…
Tree P4178 Tree 点分治板子. 点分治就是直接找树的重心进行暴力计算,每次树的深度不会超过子树深度的\(\frac{1}{2}\),计算完就消除影响,找下一个重心. 所以伪代码: void solve(int u) { calc(u); used[u]=true; for(int i=head[u];i;i=e[i].nxt) { int v=e[i].to; if(!used[v]) { getroot(v) solve(root); } } } calc因题而异,主要靠思维.…
点分治 还是一道点分治,和前面那道题不同的是求所有距离小于等于k的点对. 如果只是等于k,我们可以把重心的每个子树分开处理,统计之后再合并,这样可以避免答案重复(也就是再同一个子树中出现路径之和为k的点) 但是对于这道题,如果我们还要这样求的话显然是会超时的,意外要枚举所有点的话有点勉强 ... 考虑一次把重心的子树全部遍历,统计到重心的距离,放进数组中,排序.然后我们可以用指针对撞的方法,用l,r两个指针分别从前后开始扫描. 容易发现,当指针再l的位置时,如果我们记录距离排好序的数组rd[l]…
经典的k条白边MST 带权二分,按照套路我们要选择尽量少的白边. #include <cstdio> #include <algorithm> ; int D; struct Edge { int x, y, val, col; inline bool operator <(const Edge &w) const { if(val - D * col == w.val - D * w.col) { return col < w.col; } return va…
传送门 又一道点分治. 直接维护子树内到根的所有路径长度,然后排序+双指针统计答案. 代码如下: #include<bits/stdc++.h> #define N 40005 using namespace std; inline int read(){ int ans=0; char ch=getchar(); while(!isdigit(ch))ch=getchar(); while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^4…
题面 重(新)学点分治中...... 普通的点分治一般这几步: 1.找重心 2.从重心开始DFS,得到信息 3.统计经过重心的路径 4.分别分治几棵子树,继续这个过程 然后是常见的(制杖的我的)一些疑问 1.这么统计不会漏吗 不会,你递归进子树的时候经过当前重心的已经统计完了,分别统计子树就行 2.这么统计不会重吗 不会,因为你进子树不会往回走(这俩都是啥问题啊...) 3.复杂度? $O(n\log n)$,根据重心的性质可得 这个题把所有路径排个序然后双指针扫即可,复杂度$O(n\log n…
题解:模拟 一旦不匹配就要break #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int l,q; ],xi[],yi[]; ]; int main() { scanf("%d%d",&l,&q); ;i<=l;i++) cin>>s[i]; ;i<=q;…
题目背景 usqwedf 改编系列题. 题目描述 如果你在百忙之中抽空看题,请自动跳到第六行. 众所周知,在中国古代算筹中,红为正,黑为负…… 给定一个1*(2n)的矩阵(usqwedf:这不是一个2n的队列么),现让你自由地放入红色算筹和黑色算筹,使矩阵平衡[即对于所有的i(1<=i<=2n),使第1~i格中红色算筹个数大于等于黑色算筹] 问有多少种方案满足矩阵平衡. 见样例解释. 输入输出格式 输入格式: 正整数 n 输出格式: 方案数t对100取模 输入输出样例 输入样例#1: 2 输出…
题目大意:给一棵树,问有多少条路径长度小于等于$k$ 题解:点分治 卡点:无 C++ Code: #include <cstdio> #include <algorithm> #define maxn 40010 const int inf = 0x3f3f3f3f; inline int max(int a, int b) {return a > b ? a : b;} int head[maxn], cnt; struct Edge { int to, nxt, w; }…
题目:https://www.luogu.org/problemnew/show/P4178 点分治.如果把每次的 dis 和 K-dis 都离散化,用树状数组找,是O(n*logn*logn),会T7个点. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; ; ],nxt[N&…
https://www.luogu.org/problemnew/show/1847 题目背景 本题为轰炸数据加强版 题目描述 一个城市遭到了M次轰炸,每次都炸了一个每条边都与边界平行的矩形 在轰炸后,有N个关键点,指挥官想知道,它们有没有受到过轰炸,如果有,被炸了几次,最后一次是第几轮. 输入输出格式 输入格式: 第一行,两个整数:M,N 以下M行,每行四个整数:x1.y1.x2.y2,表示被轰炸的矩形的左上角坐标和右下角坐标(比如1 3 7 10就表示被轰炸的地方是从(1,3)到(7,10)…
题目:https://www.luogu.org/problemnew/show/P4178 这道题要把 dep( dis? ) 加入一个 tmp 数组里,排序,计算点对,复杂度很美: 没有写 sort 竟然还有50分! 虽然调了很久不过第一次用对拍找出了错误! 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std…
题目背景 usqwedf 改编系列题. 题目描述 如果你在百忙之中抽空看题,请自动跳到第六行. 众所周知,在中国古代算筹中,红为正,黑为负…… 给定一个1*(2n)的矩阵(usqwedf:这不是一个2n的队列么),现让你自由地放入红色算筹和黑色算筹,使矩阵平衡[即对于所有的i(1<=i<=2n),使第1~i格中红色算筹个数大于等于黑色算筹] 问有多少种方案满足矩阵平衡. 见样例解释. 输入输出格式 输入格式: 正整数 n 输出格式: 方案数t对100取模 输入输出样例 输入样例#1: 复制 2…