[bzoj2631]tree_LCT】的更多相关文章

tree bzoj-2631 题目大意:给定一个n个点的树,每个点的初始权值为1,支持:删边加边(这两个操作同时进行,保证操作之后还是一棵树),路径加,路径乘,查询路径和. 注释:$1\le n,q\le 10^5$,$1\le c \le 10^4$. 想法:暴力给的很优雅:15‘没有加边删边且保证是链,我们直接用线段树维护.50'没有加边删边,我们裸上树剖+线段树.满分的话我们用LCT维护加边删边. 具体地:我的习惯是先×后+,所以每一次乘法都先将加法标记也进行修改.询问的话直接makero…
这两题都是link cut tree的裸题之前看Qtree的论文,只会在确定父子关系的情况下连边和删边如果在任意两个点连边删边怎么做呢?这时候我们不能随意的将一个点的父节点设为另一个点,因为其中某个点的父节点可能已经被设为另外某点了其实很简单,连边的时候,我们只要把x变成其所在原树的根,这样x是没有父节点了然后把x的父节点设为y即可,删边.询问路径的道理类似,具体见程序给出的是bzoj2631的程序 ; ..] of longint; rev:..] of boolean; son:..,..]…
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define mod 51061 #define maxn 100005 #define ll unsigned int using namespace std; ],size[maxn]; bool rev[maxn]; ll val[maxn],lazy…
1.题目大意:bzoj1798的lct版本 2.分析:这个把线段树改成splay就好 #include <stack> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; #define LL long long namespace LinkCutTree{ struct Node{ Node *ch[2…
2016-06-01 08:50:36 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2631 注意加和乘的标记下传问题. 还有就是split后,要分清x和y哪个是祖先. pushup在access和rotate后都要进行. 这题还卡常数,开ll就会T,开unsigned int即可. #include<bits/stdc++.h> #define inf 1000000000 #define uint unsigned int #def…
要打mul和add的lct 50000+的mod用unsigned int好了TAT (坑爹没打pc('\n');(静态)调了好久,样例竟然只输出一个,orz,也不提示PE T_T) #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cstdio> using namespace std; ; *],*I=in,*O=out; #…
用LCT实现路径加,路径乘,断开及加上一条边(保证是树),查询路径和. #include <cstdio> #include <algorithm> #define l(x) t[x].s[0] #define r(x) t[x].s[1] #define f(x) t[x].f #define lc(x) (r(f(x)) == x) #define int unsigned int , p = ; ]; int n,m,x,y,c,tp,q[N]; ],sm,sz,mu,ad,…
Description 一棵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的余数. Input 第一行两个整数n,q 接下来n-1行每行两个正…
题解: lct+链上修改 每一次修改的时候记录lazy标记 如果有了乘法,加法的lazy标记也要相应的随之变化 代码: #pragma GCC optimize(2) #include<bits/stdc++.h> ,N=; typedef unsigned ll; using namespace std; int read() { ;char ch=getchar(); ';ch=getchar()); +ch-'; return x; } ],fa[N],size[N],q[N],rev[…
题目描述 一棵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,描述这棵树接下来q行,每行描述…