bzoj2631(权限题。。。):链接
落咕:链接
考察的是LCT维护链上信息。
但是这个题不一样的是又有加法又有乘法。。。(有木有想到落咕的模板——线段树2qwq)
因为乘法的运算优先度比加法高,所以我们要先做乘法再做加法(证明?去看线段树2的题解吧),push_down的时候要注意一下。
处理一条路径的时候,直接split拉出来,然后在根节点进行修改就行了,push_down的时候会把它的标记传递下去,也就完成了一条路径上的加乘操作。
注意计算乘法的时候别忘了*1ll,因为有可能爆int(好吧,作为惯例,一般涉及到乘法再取模操作的时候,中间都要加一个强制类型转换防止爆int qwqwq)
最后还有一个坑点,数据输入的时候有乘0的情况,所以我们在push_down的时候判断有没有乘法标记不能写if(t[x].mul>1),正确写法应该是if(t[x].mul!=1)。。。。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 100010
#define mod 51061
using namespace std;
int n,m,tot;
int s[MAXN];
struct Node{int add,mul,v,rev,son,sum,ff,ch[2];}t[MAXN];
inline void push_up(int x)
{t[x].sum=(t[t[x].ch[0]].sum+t[t[x].ch[1]].sum+t[x].v)%mod;t[x].son=t[t[x].ch[0]].son+t[t[x].ch[1]].son+1;
}
inline bool isroot(int x){return t[t[x].ff].ch[0]!=x&&t[t[x].ff].ch[1]!=x;}
inline void rotate(int x)
{int y=t[x].ff;int z=t[y].ff;int k=t[y].ch[1]==x;if(!isroot(y)) t[z].ch[t[z].ch[1]==y]=x; t[x].ff=z;t[y].ch[k]=t[x].ch[k^1]; t[t[x].ch[k^1]].ff=y;t[x].ch[k^1]=y; t[y].ff=x;push_up(y),push_up(x);
}
inline void Mul(int x,int k)
{t[x].mul=1ll*t[x].mul*k%mod;t[x].add=1ll*t[x].add*k%mod;t[x].v=1ll*t[x].v*k%mod;t[x].sum=1ll*t[x].sum*k%mod;
}
inline void Add(int x,int k)
{t[x].add=(t[x].add+k)%mod;t[x].v=(t[x].v+k)%mod;t[x].sum+=1ll*k*t[x].son%mod,t[x].sum%=mod;
}
inline void push_down(int x)
{if(t[x].rev){if(t[x].ch[0]) t[t[x].ch[0]].rev^=1;if(t[x].ch[1]) t[t[x].ch[1]].rev^=1;swap(t[x].ch[0],t[x].ch[1]);t[x].rev^=1;}if(t[x].mul!=1){if(t[x].ch[0]) Mul(t[x].ch[0],t[x].mul);if(t[x].ch[1]) Mul(t[x].ch[1],t[x].mul);t[x].mul=1;}if(t[x].add){if(t[x].ch[0]) Add(t[x].ch[0],t[x].add);if(t[x].ch[1]) Add(t[x].ch[1],t[x].add);t[x].add=0;}
}
inline void splay(int x)
{s[tot=1]=x;for(int i=x;!isroot(i);i=t[i].ff) s[++tot]=t[i].ff;while(tot) push_down(s[tot--]);while(!isroot(x)){int y=t[x].ff;int z=t[y].ff;if(!isroot(y))((t[y].ch[0]==x)^(t[z].ch[0]==y))?rotate(x):rotate(y);rotate(x);}
}
inline void access(int x)
{for(int y=0;x;y=x,x=t[x].ff)splay(x),t[x].ch[1]=y,push_up(x);
}
inline void makeroot(int x){access(x);splay(x);t[x].rev^=1;}
inline void split(int x,int y){makeroot(x);access(y);splay(y);}
inline void cut(int x,int y){split(x,y);t[y].ch[0]=t[x].ff=0;push_up(y);}
inline void link(int x,int y){makeroot(x);t[x].ff=y;}
inline int findroot(int x)
{   access(x);splay(x);while(t[x].ch[0]) x=t[x].ch[0];return x;
}
int main()
{#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);#endifscanf("%d%d",&n,&m);for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);link(u,v);}for(int i=1;i<=n;i++) t[i].son=t[i].mul=t[i].v=1;for(int i=1;i<=m;i++){char op;int u,v,c,u2,v2;scanf("%c",&op),scanf("%c",&op);if(op=='+'){scanf("%d%d%d",&u,&v,&c);split(u,v);Add(v,c);}else if(op=='-'){scanf("%d%d%d%d",&u,&v,&u2,&v2);cut(u,v);link(u2,v2);}else if(op=='*'){scanf("%d%d%d",&u,&v,&c);split(u,v);Mul(v,c);}else{scanf("%d%d",&u,&v);split(u,v);printf("%d\n",t[v].sum%mod);}} return 0;
} 

转载于:https://www.cnblogs.com/fengxunling/p/10285777.html

[国家集训队] tree Ⅱ相关推荐

  1. P2619 [国家集训队]Tree I(WQS二分/带权二分/最小生成树)

    P2619 [国家集训队]Tree I 给定一个n个点,m条边的无向图,每条边有一个颜色黑色或者白色,求解恰好有k条白色边的最小生成树. 那么看到恰好选择k个的最优性问题,我们可以利用WQS二分解决, ...

  2. 洛谷P2619 [国家集训队]Tree I 题解

    洛谷P2619 [国家集训队]Tree I 题解 题目链接:P2619 [国家集训队]Tree I 题意: 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有 need\text{n ...

  3. 洛谷:P2619 [国家集训队]Tree I(最小生成树、二分加权)

    国家集训队是不一样 题意: 很清晰不赘述 思路: 没写过应该想不到. 可以证明给所有白边枚举加权,一定有一种权值情况可以满足恰好 need 条白边,同时是最小生成树. 观察可以发现具有二分性,二分的不 ...

  4. BZOJ2654/COGS1764 [2012国家集训队]tree(陈立杰) [生成树,二分]

    BZOJ传送门,COGS传送门 tree Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V, ...

  5. P1501 [国家集训队]Tree II

    \(\color{#0066ff}{ 题目描述 }\) 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数 ...

  6. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

  7. P2619 [国家集训队2]Tree I

    P2619 [国家集训队2]Tree I 链接 分析: 为了确定白边选入的数量,所以给白边加一个权值,二分这个值,然后最小生成树.可以发现白边的数量虽这个值的增大而减小,满足单调性. 有一个问题:如果 ...

  8. [国家集训队2012]tree(陈立杰)

    1764. [国家集训队2012]tree(陈立杰) ★★★   输入文件: nt2012_tree.in   输出文件: nt2012_tree.out    简单对比 时间限制:3 s   内存限 ...

  9. tree(陈立杰)[国家集训队2012]

    时间限制:3.0s   内存限制:1.0GB [大意] 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. [输入格式] 第一行V,E,ne ...

最新文章

  1. 盘点六大在中国复制失败的O2O案例
  2. 解惑:为什么云计算和物联网会同时出现——微云网络
  3. 动态生成表格、隐藏表格、选中删除任意行、jquery、输入验证
  4. oracle临时表空间暴涨,如何解决Oracle临时表空间过大
  5. leetcode - 226. 翻转二叉树
  6. HighGUI参考手册
  7. wtf是转换ttf_WTF入门,它是终端的仪表板
  8. 用Eclipse制作博客
  9. JAVA多线程之男朋友和女朋友之间的故事
  10. PLC编程入门基础知识
  11. 【转】中控系统的概念、特点及功能
  12. ElasticSearch 倒排索引(Inverted Index)| 什么是倒排索引?
  13. Axure绘制跑马灯
  14. [翻译] 在 Overleaf 中上传项目
  15. 自考本科英语(二)学习笔记和考试经验
  16. 断点续传的原理(转)
  17. 分享几个阿里云盘资源搜索引擎
  18. 怎么将几个QQ对话窗口合并和分离
  19. 泉州计算机编程培训班,泉州编程小学生培训班
  20. 【Ubuntu】Ubuntu16.04的主题和终端美化

热门文章

  1. Linux 命令之 curl 的选项(英文版)
  2. 2019怎么保存低版本_CAD发给客户没字体怎么办?快速打包外部参照、字体、打印样式...
  3. 华为服务器芯片总在pc,服务器芯片 华为
  4. java 设计模式_Java设计模式的常见应用场景
  5. python进行数据查询_如何进行python数据库查询?(实例解析)
  6. C语言指针变量的运算
  7. wps生成正态分布的随机数_量子计算与机器学习: 量子生成对抗网络QGAN
  8. java顺序栈和链栈_Java的顺序栈和链式栈
  9. 协议转换器的特点有哪些?
  10. 【渝粤教育】国家开放大学2018年秋季 1087t数学分析专题研究 参考试题