【题解】

  维护乘法标记和加法标记的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. Web安全总结摘录

    借助刚才看到的文章,回顾一下常见的Web安全问题:XSS.CSRF.SQL注入漏洞. 一.XSS XSS (Cross Site Script),跨站脚本攻击,因为缩写和 CSS (Cascading ...

  2. Linux-----Kconfig文件的简介

    内核源码树的目录下都有两个文件Kconfig和Makefile.分布到各目录的Kconfig构成了一个分布式的内核配置数据库, 每个Kconfig分别描述了所属目录源文件相关的内核配置菜单.在内核配置 ...

  3. obs nginx-rtmp-module搭建流媒体服务器实现直播 ding

    接下来我就简单跟大家介绍一下利用nginx来搭建流媒体服务器. 我选择的是腾讯云服务器 1.下载nginx-rtmp-module: nginx-rtmp-module的官方github地址:http ...

  4. E20171212-hm

    odd   adj. 古怪的; 奇数的; 剩余的; 临时的; odd number 奇数 even adj. 偶数的 even number 偶数

  5. HTML 5.1 -- 14项新增功能及如何使用

    最近太忙了 过完年来 连续的加班让我筋疲力尽,今天终于把东西交了,抽空来点干货吧! 1. 响应式图像 W3C 引入了一些功能特性,无需使用 CSS 就可以实现响应式图像.它们是 … srcset 图像 ...

  6. 自动生成 html5 小页面

    StringBuilder htmltext = new StringBuilder();            try            {                //var readP ...

  7. 对数组名取地址&a和 数组首地址a

    #include <iostream> using namespace std; ] = {,,,,}; int main() { cout<<a<<" ...

  8. [转]ASP.NET MVC HtmlHelper扩展之Calendar日期时间选择

    本文转自:http://blog.bossma.cn/asp_net_mvc/asp-net-mvc-htmlhelper-calendar-datetime-select/ 这里我们扩展HtmlHe ...

  9. Previous operation has not finished; run 'cleanup' if it was interrupted.SVN报错

    原因: 错误的原因是SVN管理的文件夹改名.删除文件太过频繁,导致有操作挂起了. 解决方式: 1.百度sqlite3.exe并下载. 2.将该文件解压到项目根目录下的.svn文件夹中. 3.打开cmd ...

  10. SQLiteDeveloper 工具

    破解方法: cmd下执行命令:  reg delete HKEY_CURRENT_USER\SharpPlus\SqliteDev /f