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); }
inline int read(){
int X = 0, w = 0; char ch = 0;
while(!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
while(isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
return w ? -X : X;
}
inline int gcd(int a, int b){ return a % b ? gcd(b, a % b) : b; }
inline int lcm(int a, int b){ return a / gcd(a, b) * b; }
template<typename T>
inline T max(T x, T y, T z){ return max(max(x, y), z); }
template<typename T>
inline T min(T x, T y, T z){ return min(min(x, y), z); }
template<typename A, typename B, typename C>
inline A fpow(A x, B p, C lyd){
A ans = 1;
for(; p; p >>= 1, x = 1LL * x * x % lyd)if(p & 1)ans = 1LL * x * ans % lyd;
return ans;
}
const ll N = 200005;
ll n, q, tot, p, ch[N][2], size[N], rev[N], val[N], fa[N], sum[N], mul[N], add[N], st[N]; void newNode(ll v){
val[++tot] = v; size[tot] = mul[tot] = 1, sum[tot] = v;
ch[tot][0] = ch[tot][1] = fa[tot] = rev[tot] = add[tot] = 0;
} bool isRoot(ll x){
return (ch[fa[x]][0] != x && ch[fa[x]][1] != x);
} void pushMul(ll x, ll c){
mul[x] *= c, add[x] *= c, sum[x] *= c, val[x] *= c;
mul[x] %= p, add[x] %= p, sum[x] %= p, val[x] %= p;
} void pushAdd(ll x, ll c){
add[x] += c, sum[x] += size[x] * c, val[x] += c;
add[x] %= p, sum[x] %= p, val[x] %= p;
} void pushRev(ll x){
rev[x] ^= 1, swap(ch[x][0], ch[x][1]);
} void push_up(ll x){
size[x] = size[ch[x][0]] + size[ch[x][1]] + 1;
sum[x] = (sum[ch[x][0]] + sum[ch[x][1]] + val[x]) % p;
} void push_down(ll x){
ll l = ch[x][0], r = ch[x][1];
if(mul[x] != 1){
if(l) pushMul(l, mul[x]);
if(r) pushMul(r, mul[x]);
}
if(add[x]){
if(l) pushAdd(l, add[x]);
if(r) pushAdd(r, add[x]);
}
if(rev[x]){
if(l) pushRev(l);
if(r) pushRev(r);
}
mul[x] = 1, add[x] = 0, rev[x] = 0;
} void rotate(ll x){
ll y = fa[x], z = fa[y], p = (ch[y][1] == x) ^ 1;
push_down(y), push_down(x);
ch[y][p^1] = ch[x][p], fa[ch[x][p]] = y;
if(!isRoot(y)) ch[z][ch[z][1] == y] = x;
fa[x] = z, fa[y] = x, ch[x][p] = y;
push_up(y), push_up(x);
} void splay(ll x){
ll pos = 0; st[++pos] = x;
for(ll i = x; !isRoot(i); i = fa[i]) st[++pos] = fa[i];
while(pos) push_down(st[pos--]);
while(!isRoot(x)){
ll y = fa[x], z = fa[y];
if(!isRoot(y)){
if((ch[y][0] == x) ^ (ch[z][0] == y)) rotate(x);
else rotate(y);
}
rotate(x);
}
push_up(x);
} void access(ll x){
for(ll pre = 0; x; pre = x, x = fa[x])
splay(x), ch[x][1] = pre, push_up(x);
} void makeRoot(ll x){
access(x), splay(x), pushRev(x);
} void split(ll x, ll y){
makeRoot(x), access(y), splay(y);
} ll findRoot(ll x){
access(x), splay(x);
while(ch[x][0]) x = ch[x][0];
splay(x);
return x;
} void link(ll x, ll y){
makeRoot(x);
if(findRoot(y) != x) fa[x] = y;
push_up(y);
} void cut(ll x, ll y){
makeRoot(x);
if(findRoot(y) == x && fa[y] == x && !ch[y][0]){
fa[y] = ch[x][1] = 0, push_up(x);
}
} int main(){ p = 51061;
scanf("%lld%lld", &n, &q);
for(int i = 1; i <= n; i ++) newNode(1);
for(int i = 1; i <= n - 1; i ++){
ll u, v; scanf("%lld%lld", &u, &v);
link(u, v);
}
while(q --){
char ch[10]; scanf("%s", &ch);
if(ch[0] == '+'){
ll u, v; scanf("%lld%lld", &u, &v);
ll c; scanf("%lld", &c);
split(u, v), pushAdd(v, c);
}
else if(ch[0] == '-'){
ll u, v; scanf("%lld%lld", &u, &v);
ll x, y; scanf("%lld%lld", &x, &y);
cut(u, v), link(x, y);
}
else if(ch[0] == '*'){
ll u, v; scanf("%lld%lld", &u, &v);
ll c; scanf("%lld", &c);
split(u, v), pushMul(v, c);
}
else if(ch[0] == '/'){
ll u, v; scanf("%lld%lld", &u, &v);
split(u, v);
printf("%lld\n", sum[v] % p);
}
}
return 0;
}

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

  1. 洛谷1501 Tree II(LCT,路径修改,路经询问)

    这个题是一个经典的维护路径信息的题,对于路径上的修改,我们只需要把对应的链\(split\)上来,然后修改最上面的点就好,注意pushdown的时候的顺序是先乘后加 然后下传乘法标记的时候,记得把对应 ...

  2. 洛谷 P1501 [国家集训队]Tree II 解题报告

    P1501 [国家集训队]Tree II 题目描述 一棵\(n\)个点的树,每个点的初始权值为\(1\).对于这棵树有\(q\)个操作,每个操作为以下四种操作之一: + u v c:将\(u\)到\( ...

  3. 洛谷P1501 [国家集训队]Tree II(LCT,Splay)

    洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2...... ...

  4. 点分治模板(洛谷P4178 Tree)(树分治,树的重心,容斥原理)

    推荐YCB的总结 推荐你谷ysn等巨佬的详细题解 大致流程-- dfs求出当前树的重心 对当前树内经过重心的路径统计答案(一条路径由两条由重心到其它点的子路径合并而成) 容斥减去不合法情况(两条子路径 ...

  5. Poj1741/洛谷P4718 Tree(点分治)

    题面 有多组数据:Poj 无多组数据:洛谷 题解 点分治板子题,\(calc\)的时候搞一个\(two\ pointers\)扫一下统计答案就行了. #include <cmath> #i ...

  6. 【洛谷 P1501】 [国家集训队]Tree II(LCT)

    题目链接 Tree Ⅱ\(=\)[模板]LCT+[模板]线段树2.. 分别维护3个标记,乘的时候要把加法标记也乘上. 还有就是模数的平方刚好爆\(int\),所以开昂赛德\(int\)就可以了. 我把 ...

  7. 【刷题】洛谷 P1501 [国家集训队]Tree II

    题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的 ...

  8. 洛谷P1501 [国家集训队]Tree II(LCT)

    题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的 ...

  9. 洛谷P1501 [国家集训队]Tree II(打标记lct)

    题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的 ...

随机推荐

  1. asp.net core C#设计一个实用的线程池

    菜菜呀,我最近研究技术呢,发现线上一个任务程序线程数有点多呀 CEO,CTO,CFO于一身的CXO x总,你学编程呢? 菜菜 作为公司总负责人,我以后还要管理技术部门呢,怎么能不会技术呢 CEO,CT ...

  2. shell删除三天前或者三天内的文件

    说明:+n 大于 n, -n 小于 n, n 相等于 n. find / -amin -30 -ls # 查找在系统中最后30分钟访问的文件find / -atime -2 -ls # 查找在系统中最 ...

  3. IIS6下使用多域名和通配符证书

    由于SSL协议,在完成握手以前,都只能采用IP地址通信方式,没有办法获取访问地址中的域名信息,所以针对每个IP地址的每个端口,服务器只能返回相同的一张证书.如果要实现多个不同域名共享一个IP地址的缺省 ...

  4. 小P的字符串

    题目描述 小P最近在研究字符编码,给出一串由0.1组成的字符串,从中任意进行截取,如果截取的字符串对应一个英文字母的ASCII值,小P就把这个0.1串叫字母子串,问给定的字符串最多能截取出多少个字母子 ...

  5. 【转】redis-cluster安装配置

    需要三台虚拟机(生产环境是3个物理机),分配静态IP.cluster中共6个节点.3主3从.本文中每个虚拟机上的redis端口:6379 6380. 需要注意的两点: 3个主节点分别位于3台虚拟机上, ...

  6. 【转】linux if 判断

    UNIX Shell 里面比较字符写法: -eq   等于-ne    不等于-gt    大于-lt    小于-le    小于等于-ge   大于等于-z 空串=    两个字符相等!=    ...

  7. react-router的坑

    componentWillReceiveProps(nextProps){ 在改钩子函数里接受组件变化的最近的传递的props 如果在这里没有使用nextprops 而是调用this.props 会出 ...

  8. [GS]uuid-ossp

    uuid-ossp 原贴地址:http://postgres.cn/docs/9.6/uuid-ossp.html 关于 OSSP的含义 uuid-ossp模块提供函数使用几种标准算法之一产生通用唯一 ...

  9. js判断数组是否包含某个字符串变量的实例

    最近碰到一个这样的现象,后台返回的数据中,数组里面有一些有变量值,有一些没有变量值. 举个例子,比如后台返回的例子是这样的: var arr=[ { "status":" ...

  10. 小程序和H5互调

    小程序跳H5页面 https://blog.csdn.net/mytljp/article/details/81030687(copy) H5页面跳小程序 https://blog.csdn.net/ ...