洛谷 1501 [国家集训队]Tree II BZOJ 2631 Tree

【题解】
维护乘法标记和加法标记的LCT
#include<cstdio>
#include<algorithm>
#define Mod (51061)
#define N 100010
#define rg register
#define ls (c[u][0])
#define rs (c[u][1])
#define MOD(k) (k-=k>=Mod?Mod:0)
using namespace std;
int n,m,top,fa[N],c[N][],rev[N],st[N],size[N];
unsigned int val[N],del[N],mul[N],sum[N];
struct edge{
int u,v;
}e[N<<];
inline int read(){
int k=,f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
return k*f;
}
inline bool isroot(int u){return c[fa[u]][]!=u&&c[fa[u]][]!=u;}
inline bool which(int u){return c[fa[u]][]==u;}
inline void pushup(int u){
sum[u]=sum[ls]+sum[rs]+val[u]; sum[u]%=Mod;
size[u]=size[ls]+size[rs]+;
}
inline void pushdown(int u){
if(rev[u]){
rev[u]=; rev[ls]^=; rev[rs]^=; swap(ls,rs);
}
del[ls]*=mul[u]; del[ls]%=Mod;
del[rs]*=mul[u]; del[rs]%=Mod;
mul[ls]*=mul[u]; mul[ls]%=Mod;
mul[rs]*=mul[u]; mul[rs]%=Mod;
val[ls]*=mul[u]; val[ls]%=Mod;
val[rs]*=mul[u]; val[rs]%=Mod;
sum[ls]*=mul[u]; sum[ls]%=Mod;
sum[rs]*=mul[u]; sum[rs]%=Mod;
del[ls]+=del[u]; MOD(del[ls]);
del[rs]+=del[u]; MOD(del[rs]);
val[ls]+=del[u]; MOD(val[ls]);
val[rs]+=del[u]; MOD(val[rs]);
sum[ls]+=del[u]*size[ls]; sum[ls]%=Mod;
sum[rs]+=del[u]*size[rs]; sum[rs]%=Mod;
mul[u]=; del[u]=;
}
void rotate(int u){
int f=fa[u],gf=fa[f],wh=which(u);
if(!isroot(f)) c[gf][which(f)]=u;
fa[u]=gf; fa[f]=u; fa[c[u][wh^]]=f;
c[f][wh]=c[u][wh^]; c[u][wh^]=f;
pushup(f); pushup(u);
}
void splay(int u){
st[top=]=u;
for(rg int i=u;!isroot(i);i=fa[i]) st[++top]=fa[i];
for(rg int i=top;i;i--) pushdown(st[i]);
while(!isroot(u)){
if(!isroot(fa[u])) rotate(which(u)==which(fa[u])?fa[u]:u);
rotate(u);
}
}
inline void access(int u){
for(rg int son=;u;son=u,u=fa[u]) splay(u),c[u][]=son,pushup(u);
}
inline void makeroot(int u){access(u); splay(u); rev[u]^=;}
int find(int u){
access(u); splay(u);
while(ls) u=ls; return u;
}
void split(int x,int y){makeroot(x); access(y); splay(y);}
void link(int x,int y){makeroot(x); fa[x]=y;}
void cut(int x,int y){
split(x,y); int t=c[y][];
if(t==x&&!c[t][]) fa[x]=,c[y][]=;
else{
while(c[t][]) t=c[t][];
if(t==x) fa[x]=,c[fa[t]][]=;
}
}
int main(){
n=read(); m=read();
for(rg int i=;i<=n;i++) mul[i]=val[i]=;
for(rg int i=;i<n;i++){
e[i].u=read(); e[i].v=read();
link(e[i].u,e[i].v);
}
while(m--){
char c=getchar();
while(c!='*'&&c!='/'&&c!='+'&&c!='-') c=getchar();
if(c=='+'){
int u=read(),v=read(),c=read();
split(u,v);
del[v]+=c; MOD(del[v]);
val[v]+=c; MOD(val[v]);
sum[v]+=c*size[v]; sum[v]%=Mod;
}
else
if(c=='-'){
int u1=read(),v1=read(),u2=read(),v2=read();
cut(u1,v1); link(u2,v2);
}
else
if(c=='/'){
int u=read(),v=read();
split(u,v); printf("%d\n",sum[v]%Mod);
}
else{
int u=read(),v=read(),c=read();
split(u,v);
val[v]*=c; val[v]%=Mod;
mul[v]*=c; mul[v]%=Mod;
del[v]*=c; del[v]%=Mod;
sum[v]*=c; sum[v]%=Mod;
}
}
return ;
}
洛谷 1501 [国家集训队]Tree II BZOJ 2631 Tree的更多相关文章
- 洛谷.1501.[国家集训队]Tree II(LCT)
题目链接 日常zz被define里没取模坑 //标记下放同线段树 注意51061^2 > 2147483647,要开unsigned int //*sz[]别忘了.. #include < ...
- 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)
洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...
- 洛谷 P1501 [国家集训队]Tree II 解题报告
P1501 [国家集训队]Tree II 题目描述 一棵\(n\)个点的树,每个点的初始权值为\(1\).对于这棵树有\(q\)个操作,每个操作为以下四种操作之一: + u v c:将\(u\)到\( ...
- 洛谷P1501 [国家集训队]Tree II(LCT,Splay)
洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2...... ...
- 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)
洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...
- [洛谷P1527] [国家集训队]矩阵乘法
洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...
- 洛谷 P1527 [国家集训队]矩阵乘法 解题报告
P1527 [国家集训队]矩阵乘法 题目描述 给你一个\(N*N\)的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第\(K\)小数. 输入输出格式 输入格式: 第一行两个数\(N,Q\),表示矩阵大 ...
- BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]
BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...
- [洛谷P2839][国家集训队]middle
题目大意:给你一个长度为$n$的序列$s$.$Q$个询问,问在$s$中的左端点在$[a,b]$之间,右端点在$[c,d]$之间的子段中,最大的中位数. 强制在线. 题解:区间中位数?二分答案,如果询问 ...
随机推荐
- Web安全总结摘录
借助刚才看到的文章,回顾一下常见的Web安全问题:XSS.CSRF.SQL注入漏洞. 一.XSS XSS (Cross Site Script),跨站脚本攻击,因为缩写和 CSS (Cascading ...
- python调用java程序--jpype
官方网站:http://jpype.sourceforge.net/ 官方使用文档:http://jpype.sourceforge.net/doc/user-guide/userguide.html ...
- 最大流增广路(KM算法) HDOJ 1533 Going Home
题目传送门 /* 最小费用流:KM算法是求最大流,只要w = -w就可以了,很经典的方法 */ #include <cstdio> #include <cmath> #incl ...
- java 分解整数 【个 十 百】(数组案例)
求一个数两位数的个位数,十位数,百位数及千位: int num = 53; int g = (num / 1) % 10; //个位 int s = (num / 10) % 10; //十位 in ...
- java设计模式之单例模式总结
面试手写单例模式(通用版)
- mongodb数据库命令
常用数据库命令汇总 Database Commands Api 下面简单列一下Shell常用的基本命令 启动连接Mongodb #带配置信息启动 mongod -f xxx.conf #连接 mong ...
- Farseer.net轻量级开源框架 入门篇:修改数据详解
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 添加数据详解 下一篇:Farseer.net轻量级开源框架 入门篇: 删除数据详解 ...
- HTML 5 <aside> 标签
定义和用法 <aside> 标签定义 article 以外的内容.aside 的内容应该与 article 的内容相关. 实例 <p>Me and my family visi ...
- iOS,Core Animation--负责视图的复合功能
简介 UIKit API UIKit是一组Objective-C API,为线条图形.Quartz图像和颜色操作提供Objective-C 封装,并提供2D绘制.图像处理及用户接口级别的动画. ...
- 并发编程学习笔记(12)----Fork/Join框架
1. Fork/Join 的概念 Fork指的是将系统进程分成多个执行分支(线程),Join即是等待,当fork()方法创建了多个线程之后,需要等待这些分支执行完毕之后,才能得到最终的结果,因此joi ...