【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=2631

【题目大意】

  要求支持链修改,链查询,边断开,连接操作

【题解】

  链修改分乘和加split之后在LCT上打tag,断开和连接LCT基础操作即可。

【代码】

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const LL mod=51061;
const int N=100010;
int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
namespace Link_Cut_Tree{int f[N],son[N][2],tmp[N],size[N]; bool rev[N];LL val[N],sum[N],at[N],mt[N];void Initialize(){memset(f,0,sizeof(f));memset(son,0,sizeof(son));memset(val,0,sizeof(val));memset(rev,0,sizeof(rev));memset(sum,0,sizeof(sum));memset(at,0,sizeof(at));memset(mt,0,sizeof(mt));} void modify(int x,int m,int a){if(!x)return;val[x]=(val[x]*m+a)%mod;sum[x]=(sum[x]*m+a*size[x])%mod;at[x]=(at[x]*m+a)%mod;mt[x]=(mt[x]*m)%mod;}bool isroot(int x){return !f[x]||son[f[x]][0]!=x&&son[f[x]][1]!=x;}void rev1(int x){if(!x)return;swap(son[x][0],son[x][1]);rev[x]^=1;}void pb(int x){if(rev[x])rev1(son[x][0]),rev1(son[x][1]),rev[x]=0;int m=mt[x],a=at[x];mt[x]=1; at[x]=0;if(m!=1||a!=0){modify(son[x][0],m,a);modify(son[x][1],m,a);}}void up(int x){ sum[x]=(val[x]+sum[son[x][0]]+sum[son[x][1]])%mod;size[x]=(size[son[x][0]]+size[son[x][1]]+1)%mod;}void rotate(int x){int y=f[x],w=son[y][1]==x;son[y][w]=son[x][w^1];if(son[x][w^1])f[son[x][w^1]]=y;if(f[y]){int z=f[y];if(son[z][0]==y)son[z][0]=x;else if(son[z][1]==y)son[z][1]=x;}f[x]=f[y];f[y]=x;son[x][w^1]=y;up(y);}void splay(int x){int s=1,i=x,y;tmp[1]=i;while(!isroot(i))tmp[++s]=i=f[i];while(s)pb(tmp[s--]);while(!isroot(x)){y=f[x]; if(!isroot(y)){if((son[f[y]][0]==y)^(son[y][0]==x))rotate(x);else rotate(y);}rotate(x);}up(x);}void access(int x){for(int y=0;x;y=x,x=f[x])splay(x),son[x][1]=y,up(x);}// 查询x所在的树的根int root(int x){access(x);splay(x);while(son[x][0])x=son[x][0];return x;}// 使x成为根void makeroot(int x){access(x);splay(x);rev1(x);}// 将x和y所属树合并void link(int x,int y){makeroot(x);f[x]=y;access(x);}// 将x和其父节点分开 void cutf(int x){access(x);splay(x);f[son[x][0]]=0;son[x][0]=0;up(x);}// 将边x-y切断void cut(int x,int y){makeroot(x);cutf(y);}// 提取链void split(int x,int y){makeroot(y);access(x);splay(x);}// 查询x到y的链和int ask(int x,int y){split(x,y);return sum[x];}// 查询节点到根的距离int query(int x){access(x);splay(x);return sum[x];}// 将x为下标的值改为yint change(int x,int y){makeroot(x);val[x]=y;up(x);}// 将x的父亲改为yint changef(int x,int y){cutf(x);f[x]=y;}// 链上点权加法void add(int x,int y,int z){split(x,y);modify(x,1,z);}// 链上点权乘法void mul(int x,int y,int z){split(x,y);modify(x,z,0);}
}
int n,m;
int main(){n=read(); m=read();using namespace Link_Cut_Tree;Initialize();for(int i=1;i<=n;i++)val[i]=sum[i]=mt[i]=size[i]=1;for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);link(x,y);}char op[5];while(m--){scanf("%s",op);int x,y,z;if(op[0]=='+'){x=read();y=read();z=read();add(x,y,z);}if(op[0]=='-'){x=read();y=read();cut(x,y);x=read();y=read();link(x,y);}if(op[0]=='*'){x=read();y=read();z=read();mul(x,y,z);}if(op[0]=='/'){x=read();y=read();printf("%d\n",ask(x,y));}}return 0;
}

转载于:https://www.cnblogs.com/forever97/p/bzoj2631.html

BZOJ 2631 tree(动态树)相关推荐

  1. bzoj 2631: tree

    Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 2928  Solved: 975 [Submit][Status][Discuss] Descrip ...

  2. BZOJ 3730: 震波 动态树分治 线段树 lca

    3730: 震波 Time Limit: 15 Sec  Memory Limit: 256 MB Submit: 1202  Solved: 288 [Submit][Status][Discuss ...

  3. Link-Cut Tree动态树模板

    讲解博客:https://www.cnblogs.com/zhoushuyu/p/8137553.html struct Link_Cut_Tree {int fa[N],ch[N][2],sum[N ...

  4. BZOJ 2759 一个动态树好题 (LCT)

    滚回来学文化课了-- 题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2759 题解 LCT,显然的做法是维护链上所有一次函数的复合. 如何 ...

  5. P3690-[模板]Link Cut Tree(动态树)【Splay】

    正题 题目链接:https://www.luogu.org/problem/P3690 题目大意 nnn个点mmm个操作,要求支持 询问路径异或和 连接一条边(若x,yx,yx,y没联通) 删除一条边 ...

  6. BZOJ2759 一个动态树好题

    题目 有\(N\)个未知数\(x[1..n]\)和\(N\)个等式组成的同余方程组: \(x[i]=k[i]*x[p[i]]+b[i] mod 10007\) 其中,\(k[i],b[i],x[i]∈ ...

  7. luoguP3690 【模板】Link Cut Tree (动态树)[LCT]

    题目背景 动态树 题目描述 给定N个点以及每个点的权值,要你处理接下来的M个操作.操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor ...

  8. Dojo学习13 dijit.Tree 动态添加节点之一

    为什么80%的码农都做不了架构师?>>>    13. dijit.Tree 动态添加节点之一 对dijit.Tree研究了很久,源代码也看了好多遍了.对于fx这个类的研究还需要更深 ...

  9. 如何利用FineReport制作动态树报表

    在对数据字段进行分类管理时,利用动态树折叠数据是一个很好的方法,也就是点击数据前面的加号才展开对应下面的数据,如下图.那这样的效果在制作报表时该如何实现呢? 下面以报表工具FineReport为例介绍 ...

最新文章

  1. 14_传智播客iOS视频教程_instancetype
  2. LeetCode Copy List with Random Pointer
  3. 服务器共享文件和电脑同步,云服务器共享文件夹同步
  4. JavaOne 2016 Essentials:7个您不容错过的事件和会话
  5. C++ multimap的插入
  6. HDU 6113 度度熊的01世界【DFS/Flood Fill】
  7. 高考平行报志愿计算机录取规则,高考平行志愿录取规则是什么
  8. python framework jdon_python – Django Rest Framework和JSONField
  9. span width无效
  10. DEVONthink Pro作为浏览器插件脚本,如何使用
  11. 计算机的屏幕为什么成黑色,电脑液晶显示器老是黑屏怎么回事
  12. 十月的天气 风吹过你的气息
  13. 眨眼网杨莹,能写代码能玩时尚的美女CEO-搜狐
  14. 无线打印机与手机连接到服务器,图文详解手机通过无线Wifi连接打印机的方法...
  15. RIDE中testcase的edit界面显示异常/空白
  16. c语言:模拟用户密码登录
  17. lamport面包店算法详细讲解及代码实现
  18. 服务器网口修改为百兆,服务器千兆网口能否设置为百兆
  19. matlab如何查看眼图q值,详解:什么是眼图、眼图怎么看?
  20. css实现聊天气泡对话框

热门文章

  1. 清除用友所有单据锁定的SQL语句
  2. Disabling Shortcut Keys in Full Screen mode
  3. GIS软件开发工具包TatukGIS Developer Kernel 发布 v11.3.0-Unstable1丨附下载 1
  4. PHP面向对象(OOP)----分页类 1
  5. git学习资料及心得
  6. ylbtech-LanguageSamples-Struct(结构)
  7. 启动和停止一个服务,修改服务的启动类型 Start and Stop Service for windows
  8. 【Linux下Inotify + Rsync文件实时同步】
  9. python十进制转二进制,八进制和十六进制
  10. 修改smb默认端口_centos7 ssh端口更改方法