【题解】

  维护乘法标记和加法标记的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. 洛谷P3216 [HNOI2011]数学作业

    题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenat ...

  2. Java IO --ByteArrayOutputStream (六)***

    Java提供了很丰富的io接口,已经可以满足我们大部分读取数据的需求,这个在C读取数据需要自己定义缓冲区数组大小,而且要小心翼翼的防止缓冲区溢出的情况相当不同.一般情况下我们读取的数据都是直接读取成为 ...

  3. softmax function in c++

    #include <iostream> #include <vector> #include <cmath> #include <algorithm> ...

  4. CSS3常用知识点

    CSS3常用知识点 1 css3选择器 1.1 属性选择器 /* E[attr~=val] 表示的一个单独的属性值 这个属性值是以空格分隔的*/ .attr2 a[class~="kawa& ...

  5. mysql插入二千万的测试数据进行测试,int和datetime比较

    时间存储用int和datetime哪个字段更合适,建立下面的两个表 测试环境是内存2个G,一核的虚拟机 CREATE TABLE `test_inttime` ( `id` int(11) NOT N ...

  6. 洛谷 P1582 倒水

    题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒 ...

  7. spring简介及常用术语

    1.引入 在开发应用时常会遇到如下问题: 1)代码耦合性高: 2)对象之间依赖关系处理繁琐: 3)事务控制繁琐: 2.Spring简介 1)Spring概述 什么是Spring: ①Spring是一个 ...

  8. 6.13---example

    example如何使用?简单查询这个例子展示了如何用生成后的Example类去生成一个简单的where子句: TestTableExample example = new TestTableExamp ...

  9. leetcode516 Longest Palindromic Subsequence

    思路: 区间dp. 实现: class Solution { public: int longestPalindromeSubseq(string s) { int n = s.length(); ] ...

  10. python--12、pymysql模块

    安装 pip3 install pymysql 使用方法(示例表为用户注册信息表): import pymysql user=input('username: ').strip() pwd=input ...