【题解】

  维护乘法标记和加法标记的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的更多相关文章

  1. 洛谷.1501.[国家集训队]Tree II(LCT)

    题目链接 日常zz被define里没取模坑 //标记下放同线段树 注意51061^2 > 2147483647,要开unsigned int //*sz[]别忘了.. #include < ...

  2. 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)

    洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...

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

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

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

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

  5. 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)

    洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...

  6. [洛谷P1527] [国家集训队]矩阵乘法

    洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...

  7. 洛谷 P1527 [国家集训队]矩阵乘法 解题报告

    P1527 [国家集训队]矩阵乘法 题目描述 给你一个\(N*N\)的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第\(K\)小数. 输入输出格式 输入格式: 第一行两个数\(N,Q\),表示矩阵大 ...

  8. BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]

    BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...

  9. [洛谷P2839][国家集训队]middle

    题目大意:给你一个长度为$n$的序列$s$.$Q$个询问,问在$s$中的左端点在$[a,b]$之间,右端点在$[c,d]$之间的子段中,最大的中位数. 强制在线. 题解:区间中位数?二分答案,如果询问 ...

随机推荐

  1. 洛谷 P1979 [ NOIP 2013 ] 华容道 —— bfs + 最短路

    题目:https://www.luogu.org/problemnew/show/P1979 真是一道好题... 首先考虑暴力做法,应该是设 f[i][j][x][y] 记录指定棋子和空格的位置,然后 ...

  2. hdu1213 并查集不压缩

    题意:题意:一个人请人吃饭,相互认识的朋友在一张桌子,相互认识的朋友的意思是如果A认识B,B认识C,那么A.B.C是朋友,对于每组输入输出桌子的张数. Sample Input 2 5 3 1 2 2 ...

  3. java io流读取 和commons.io的使用

    前提:记事本里面一共有605个字 1.使用BufferedReader和FileReader来读取txt里面的内容,用时相对短.读完记得关闭流br.close() 2.指定UTF-8输出格式,使用Fi ...

  4. 浙江省CIO协会钱塘江论坛近日在网易云创沙龙宣布成立

    本文来自网易云社区 9月19日,由网易云与浙江省首席信息官协会共同主办的“网易云创CIO沙龙”在杭州举行,本次活动以“瞩目钱塘,赋能企业数字化创新”为主题,网易云企业服务部总经理岳峥辉,浙江省首席信息 ...

  5. 【WIP_S3】链表

    创建: 2017/12/26 完成: 2018/01/14   [TODO]     S4, S5, S14来处理动态数组   CAF8A81B790F [github 地址]传送门  链表的定义   ...

  6. js最全的十种跨域解决方案

    在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义.同 源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问 ...

  7. bzoj 1426: 收集邮票【期望dp】

    我太菜了,看的hzwer的blog才懂 大概是设f[i]表示已经拥有了i张邮票后期望还要买的邮票数,这个转移比较简单是f[i]=f[i]*(i/n)+f[i+1]*((n-i)/n)+1 然后设g[i ...

  8. P3222 [HNOI2012]射箭

    传送门 黄学长的代码好清楚啊--大概搞明白半平面交是个什么玩意儿了-- 设抛物线 \[y=ax^2+bx\] 则 \[y1<=ax1^2+bx1<=y2\] \[ax1^2+bx1> ...

  9. P3573 [POI2014]RAJ-Rally

    传送门 很妙的思路 首先这是一个DAG,于是我们先在原图和反图上各做一遍,分别求出\(diss_i\)和\(dist_i\)表示从\(i\)点出发的最短路和以\(i\)为终点的最短路 我们考虑把点分为 ...

  10. 使用docsify并定制以使它更强大

    背景 经常在网上看到一些排版非常漂亮的技术手册,左边有目录栏,右边是Markdown格式的文档,整个配色都十分舒服,就像一本书一样,一看就很让人喜欢.就比如Markdown Preview Enhan ...