洛谷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:将树中原有的 ...
随机推荐
- 每秒高达1.6亿次操作的并发键值存储库 FASTER 诞生
FASTER 在过去十年中,云中的数据密集型应用程序和服务有了巨大的增长.数据在各种边设施(例如,设备,浏览器和服务器)上创建,并由云应用程序处理用来获得数据价值或做出决策.应用程序和服务可以处理收集 ...
- elasticsearch(6.2.3)安装Head插件
一.安装elasticsearch,参照:https://www.cnblogs.com/dyh004/p/8872443.html 二.安装nodejs,参照:https://www.runoob. ...
- HDU - 1540 线段树的合并
这个题题意我大概解释一下,就是一开始一条直线,上面的点全是联通的,有三种操作 1.操作D把从左往右第x个村庄摧毁,然后断开两边的联通. 2.询问Q节点相联通的最长长度 3.把最后破坏的村庄重建. 这个 ...
- PS制作墙壁上海报卷页图片效果
1.首先,打开PS,新建合适的画布. 2.为了使背景具有质感,执行滤镜—滤镜库—纹理化,具体参数按你的感觉来. 3.新建画布“图层1”,为了方便观察,填充为灰色画布,ctrl+t适当缩小画布大小,如图 ...
- Servlet处理GET和POST请求
doGet() . doPost().service()方法 doGet()表示,当客户端是使用get方式请求该servlet时,那么就会触发执行doGet()方法中的代码. doPost()表示,当 ...
- 安装使用swoole
swoole首页:https://www.swoole.com/ 方法1:使用pecl安装 pecl install swoole 注意,php版本必须是7.0以及7.0以上的版本. 方法2:编译源码 ...
- .net WCF WF4.5 状态机、书签与持久化
想看源码请直接翻到最后,使用方式如下图 如果同时需要多个书签可以直接在需要的位置创建书签,会认为是同一个实例. 若需要实现的效果是同时需要好几个部门审核,那么只要在对应的位置同时创建多个书签即可. 编 ...
- 双击启动tomcat中的startup.bat闪退原因及解决方法
免安装的tomcat双击startup.bat后,启动窗口一闪而过,而且tomcat服务未启动. 原因是:在启动tomcat是,需要读取环境变量和配置信息,缺少了这些信息,就不能登记环境变量,导致了t ...
- vue-router的简单实现原理
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 使用npm安装一些包失败了,更换npm源
镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在): 1.通过config命令 npm config set registry https://regist ...