洛谷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); }
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的更多相关文章
- 洛谷1501 Tree II(LCT,路径修改,路经询问)
这个题是一个经典的维护路径信息的题,对于路径上的修改,我们只需要把对应的链\(split\)上来,然后修改最上面的点就好,注意pushdown的时候的顺序是先乘后加 然后下传乘法标记的时候,记得把对应 ...
- 洛谷 P1501 [国家集训队]Tree II 解题报告
P1501 [国家集训队]Tree II 题目描述 一棵\(n\)个点的树,每个点的初始权值为\(1\).对于这棵树有\(q\)个操作,每个操作为以下四种操作之一: + u v c:将\(u\)到\( ...
- 洛谷P1501 [国家集训队]Tree II(LCT,Splay)
洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2...... ...
- 点分治模板(洛谷P4178 Tree)(树分治,树的重心,容斥原理)
推荐YCB的总结 推荐你谷ysn等巨佬的详细题解 大致流程-- dfs求出当前树的重心 对当前树内经过重心的路径统计答案(一条路径由两条由重心到其它点的子路径合并而成) 容斥减去不合法情况(两条子路径 ...
- Poj1741/洛谷P4718 Tree(点分治)
题面 有多组数据:Poj 无多组数据:洛谷 题解 点分治板子题,\(calc\)的时候搞一个\(two\ pointers\)扫一下统计答案就行了. #include <cmath> #i ...
- 【洛谷 P1501】 [国家集训队]Tree II(LCT)
题目链接 Tree Ⅱ\(=\)[模板]LCT+[模板]线段树2.. 分别维护3个标记,乘的时候要把加法标记也乘上. 还有就是模数的平方刚好爆\(int\),所以开昂赛德\(int\)就可以了. 我把 ...
- 【刷题】洛谷 P1501 [国家集训队]Tree II
题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的 ...
- 洛谷P1501 [国家集训队]Tree II(LCT)
题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的 ...
- 洛谷P1501 [国家集训队]Tree II(打标记lct)
题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的 ...
随机推荐
- 朱晔的互联网架构实践心得S1E8:三十种架构设计模式(下)
朱晔的互联网架构实践心得S1E8:三十种架构设计模式(下) [下载本文PDF进行阅读] 接上文,继续剩下的15个模式. 数据管理模式 16.分片模式:将数据存储区划分为一组水平分区或分片 一直有一个说 ...
- 《React Native 精解与实战》书籍连载「iOS 平台与 React Native 混合开发」
此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...
- C#使用ILGenerator动态生成函数
游戏服务器里面总是有一大堆的配置文件需要读取, 而且这些配置文件的读取: * 要不然做成弱类型的, 就是一堆字符串或者数字, 不能看出来错误(需要重新检测一次) * 要不然做成强类型的, 每种类型都需 ...
- for 循环 以及基本的数据类型
for 循环: for 关键字 i 变量(此处可以更改 更改规则参考变量命名规则) in 关键字 可迭代对象 (想要循环谁就放谁,注意:数字除外 因为数字不可迭代) for 循环内可以进行任意操作,可 ...
- RabbitMQ总结
消息队列 三个业务场景:解耦.异步.削峰 带来问题 系统可用性降低:外部依赖越多,越容易挂掉. 系统复杂性提高:重复消费,消息丢失,消息传递的顺序性 一致性问题: 一.如何保证消息的可靠性传输(如何处 ...
- 关于PHP的那些坑
因为PHP是弱类型语言,常常会发生许多意想不到的问题,所以,我们再次一一细数这些我们踏过的坑!!! 1) foreach中自动回将key为数值的转化成整型,造成无法匹配 function transl ...
- sql之cursor的简介和字符串拆分(split)与游标的使用
字符串拆分(split)与游标的使用 CREATE TABLE Plates ( ,), ) NOT NULL, [BusinessId] INT NOT NULL, ) ),),), SELECT ...
- 3 Asking for more information
1 Could you tell me more about your idea? 2 Could I hear more about your idea? 3 Could you expain yo ...
- mybatis出现NoSuchMethodException异常
今天在idea中调试项目(ssm搭建的项目)的时候,mybatis突然出现了NoSuchMethodException异常,具体的异常时: java.lang.NoSuchMethodExceptio ...
- Mybatis Dao层注解及XML组合Dao的开发方式
mybatis可以用xml进行数据操作,也可以在dao层用注解的方式,也可以采取xml和dao层接口组合使用的方法.显然 ,后者更加简单. 实体类Student package com.zhao. ...