洛谷 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]$之间的子段中,最大的中位数. 强制在线. 题解:区间中位数?二分答案,如果询问 ...
随机推荐
- 【409】Linux 系统 Testrun
文件名:Testrun #!/bin/sh PROG=./puzzle case $1 in 1) T=Tests/bad* ;; 2) T=Tests/sol* ;; 3) T=Tests/unso ...
- 最优贸易 2009年NOIP全国联赛提高组(最短路)
最优贸易 2009年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description [问题描述]C ...
- python实现对excel数据进行修改/添加
import osimport xlrdfrom xlutils.copy import copydef base_dir(filename=None): return os.path.join(os ...
- php+ajax+jquery实现jsonp跨域
我们有这么个html文件test.html: 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- mutiset HDOJ 5349 MZL's simple problem
题目传送门 /* 这题可以用stl的mutiset容器方便求解,我对这东西不熟悉,TLE了几次,最后用读入外挂水过. 题解有O(n)的做法,还以为我是侥幸过的,后来才知道iterator it写在循环 ...
- 数据传递--------博客-----------springMVC源码分析--RequestToViewNameTranslator请求到视图名称的转换
参考来源:http://blog.csdn.net/qq924862077/article/details/54286976?utm_source=gold_browser_extension Req ...
- 实例化WebService实例对象时出现localhost未引用命名空间
//实例化WebService实例对象 localhost.WebService WebserviceInstance = new localhost.WebService(); 在实例化WebSer ...
- CSS 潜藏着的BFC
在写样式时,往往是添加了一个样式,又或者是修改了某个属性,就达到了我们的预期. 而BFC就潜藏在其中,当你修改样式时,一不小心就能触发它而毫无察觉,因此没有意识到BFC的神奇之处. 什么是BFC(Bl ...
- get、post、put、delete、head请求方式
对资源的增,删,改,查操作,其实都可以通过GET/POST完成,不一定要用PUT和DELETE. 一:Jersey框架,实现了restful风格,常用的注解@GET.@POST.@PUT.@DELET ...
- LR接口测试---Java Vuser之增删改查
import lrapi.lr; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepared ...