lct裸题

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
int n, m, uu, vv, val[100005], tagm[100005], taga[100005], sum[100005], siz[100005];
int rev[100005], ww, xx, ch[100005][2], fa[100005];
char ss[15];
const int mod=51061;
bool isRoot(int x){
return ch[fa[x]][0]!=x && ch[fa[x]][1]!=x;
}
bool getW(int x){
return ch[fa[x]][1]==x;
}
void pushMul(int x, int k){
sum[x] = (ll)sum[x] * k % mod;
val[x] = (ll)val[x] * k % mod;
tagm[x] = (ll)tagm[x] * k % mod;
taga[x] = (ll)taga[x] * k % mod;
}
void pushAdd(int x, int k){
sum[x] = (sum[x] + (ll)siz[x]*k) % mod;
val[x] = (val[x] + k) % mod;
taga[x] = (taga[x] + k) % mod;
}
void pushDown(int x){
if(tagm[x]!=1){
pushMul(ch[x][0], tagm[x]);
pushMul(ch[x][1], tagm[x]);
tagm[x] = 1;
}
if(tagm[x]){
pushAdd(ch[x][0], taga[x]);
pushAdd(ch[x][1], taga[x]);
taga[x] = 0;
}
if(rev[x]){
swap(ch[x][0], ch[x][1]);
rev[ch[x][0]] ^= 1;
rev[ch[x][1]] ^= 1;
rev[x] = 0;
}
}
void xf(int x){
if(!isRoot(x)) xf(fa[x]);
pushDown(x);
}
void upd(int x){
siz[x] = siz[ch[x][0]] + siz[ch[x][1]] + 1;
sum[x] = (sum[ch[x][0]] + sum[ch[x][1]] + val[x]) % mod;
}
void rotate(int x){
int old=fa[x], oldf=fa[old], w=getW(x);
if(!isRoot(old)) ch[oldf][ch[oldf][1]==old] = x;
ch[old][w] = ch[x][w^1]; ch[x][w^1] = old;
fa[ch[old][w]] = old; fa[ch[x][w^1]] = x; fa[x] = oldf;
upd(old); upd(x);
}
void splay(int x){
xf(x);
while(!isRoot(x)){
int f=fa[x];
if(!isRoot(f)) rotate(getW(f)==getW(x)?f:x);
rotate(x);
}
}
void access(int x){
int y=0;
while(x){
splay(x);
ch[x][1] = y;
upd(x);
y = x;
x = fa[x];
}
}
void makeRoot(int x){
access(x);
splay(x);
rev[x] ^= 1;
}
void link(int u, int v){
makeRoot(u);
fa[u] = v;
}
void splitLine(int u, int v){
makeRoot(u);
access(v);
splay(v);
}
void cut(int u, int v){
splitLine(u, v);
ch[v][0] = fa[u] = 0;
}
int main(){
cin>>n>>m;
for(int i=1; i<=n; i++)
tagm[i] = val[i] = siz[i] = 1;
for(int i=1; i<n; i++){
scanf("%d %d", &uu, &vv);
link(uu, vv);
}
while(m--){
scanf("%s", ss);
if(ss[0]=='+'){
scanf("%d %d %d", &uu, &vv, &ww);
splitLine(uu, vv);
pushAdd(vv, ww);
}
else if(ss[0]=='-'){
scanf("%d %d %d %d", &uu, &vv, &ww, &xx);
cut(uu, vv);
link(ww, xx);
}
else if(ss[0]=='*'){
scanf("%d %d %d", &uu, &vv, &ww);
splitLine(uu, vv);
pushMul(vv, ww);
}
else{
scanf("%d %d", &uu, &vv);
splitLine(uu, vv);
printf("%d\n", sum[vv]);
}
}
return 0;
}

luogu1501 [国家集训队]Tree II的更多相关文章

  1. P1501 [国家集训队]Tree II(LCT)

    P1501 [国家集训队]Tree II 看着维护吧2333333 操作和维护区间加.乘线段树挺像的 进行修改操作时不要忘记吧每个点的点权$v[i]$也处理掉 还有就是$51061^2=2607225 ...

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

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

  3. [国家集训队]Tree II

    嘟嘟嘟 这道题其实还是挺基础的,只不过操作有点多. 区间乘和区间加按线段树的方式想. 那么就先要下放乘标记,再下放加标记.但这两个和反转标记是没有先后顺序的. 对于区间加,sum加的是区间长度\(*\ ...

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

    题目链接 Tree Ⅱ\(=\)[模板]LCT+[模板]线段树2.. 分别维护3个标记,乘的时候要把加法标记也乘上. 还有就是模数的平方刚好爆\(int\),所以开昂赛德\(int\)就可以了. 我把 ...

  5. 【洛谷1501】[国家集训队] Tree II(LCT维护懒惰标记)

    点此看题面 大致题意: 有一棵初始边权全为\(1\)的树,四种操作:将两点间路径边权都加上一个数,删一条边.加一条新边,将两点间路径边权都加上一个数,询问两点间路径权值和. 序列版 这道题有一个序列版 ...

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

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

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

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

  8. 【刷题】洛谷 P1501 [国家集训队]Tree II

    题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的 ...

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

    题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的 ...

随机推荐

  1. Spring 计划任务

    计划任务在Spring 中实现变得非常简单: 1. 首先通过在配置类中注解 @EnableScheduling 来开启对计划任务的支持 2. 然后在你执行任务的方法上注解 @Scheduled 来声明 ...

  2. 初识SeekBar

    SeekBar拖动条,是Progress的间接子类 <SeekBar android:id="@+id/seekBar1" android:layout_width=&quo ...

  3. 事务回滚 DEMO

    因为有些事物回滚  查询的时候 可能查出来空值 我们肯定不愿意把空值添加数据库里面 一般基本的是这么写 if (object_id('add_T_Disclose_DiscloseList', 'P' ...

  4. myeclipes出现{Could not create the view: An unexpected except

    今天编写代码的时候突然出现了web工程不能部署的情况,后面了解到主要是因为那个myeclipse非正常关闭或者突然断电的情况,我的是属于第一种的,下面整理一下这个解决方法 1.关闭myeclipse ...

  5. Codeforces Round #Pi (Div. 2) 567E President and Roads ( dfs and similar, graphs, hashing, shortest paths )

    图给得很良心,一个s到t的有向图,权值至少为1,求出最短路,如果是一定经过的边,输出"YES",如果可以通过修改权值,保证一定经过这条边,输出"CAN",并且输 ...

  6. shell的切换

    从zsh切换到bash:在命令行输入bash即可 从bash切换到zsh:在命令行输入zsh即可

  7. docker单主机网络

    当你安装Docker时,它会自动创建三个网络.你可以使用以下docker network ls命令列出这些网络: [root@localhost ~]# docker network ls NETWO ...

  8. atoi 函数实现

      要考虑的东西实在也挺多的.总结如下:   1 前面空格分隔符号的时候   2 第一个符号位处理+ -   3 遇到非数字字符退出   4 为正数的时候,大于INT_MAX上溢   5 为负数的时候 ...

  9. checkbox点击选中,再点击取消,并显示在文本框中

    function checkItem(e,itemId) { var item = document.getElementById(itemId); var $items = $(item); if ...

  10. C#数组协方差

    对于任意两个“引用类型”A和B,如果存在从A到B的隐式引用转换或显式引用转换,则也一定存在从数组类型A[R]到数组类型B[R]的相同的引用转换,其中R可以是任何给定的“秩说明符”,但是这两个数组类型必 ...