BZOJ 2631 tree(动态树)
【题目链接】 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(动态树)相关推荐
- bzoj 2631: tree
Time Limit: 30 Sec Memory Limit: 128 MB Submit: 2928 Solved: 975 [Submit][Status][Discuss] Descrip ...
- BZOJ 3730: 震波 动态树分治 线段树 lca
3730: 震波 Time Limit: 15 Sec Memory Limit: 256 MB Submit: 1202 Solved: 288 [Submit][Status][Discuss ...
- Link-Cut Tree动态树模板
讲解博客:https://www.cnblogs.com/zhoushuyu/p/8137553.html struct Link_Cut_Tree {int fa[N],ch[N][2],sum[N ...
- BZOJ 2759 一个动态树好题 (LCT)
滚回来学文化课了-- 题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2759 题解 LCT,显然的做法是维护链上所有一次函数的复合. 如何 ...
- P3690-[模板]Link Cut Tree(动态树)【Splay】
正题 题目链接:https://www.luogu.org/problem/P3690 题目大意 nnn个点mmm个操作,要求支持 询问路径异或和 连接一条边(若x,yx,yx,y没联通) 删除一条边 ...
- BZOJ2759 一个动态树好题
题目 有\(N\)个未知数\(x[1..n]\)和\(N\)个等式组成的同余方程组: \(x[i]=k[i]*x[p[i]]+b[i] mod 10007\) 其中,\(k[i],b[i],x[i]∈ ...
- luoguP3690 【模板】Link Cut Tree (动态树)[LCT]
题目背景 动态树 题目描述 给定N个点以及每个点的权值,要你处理接下来的M个操作.操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor ...
- Dojo学习13 dijit.Tree 动态添加节点之一
为什么80%的码农都做不了架构师?>>> 13. dijit.Tree 动态添加节点之一 对dijit.Tree研究了很久,源代码也看了好多遍了.对于fx这个类的研究还需要更深 ...
- 如何利用FineReport制作动态树报表
在对数据字段进行分类管理时,利用动态树折叠数据是一个很好的方法,也就是点击数据前面的加号才展开对应下面的数据,如下图.那这样的效果在制作报表时该如何实现呢? 下面以报表工具FineReport为例介绍 ...
最新文章
- 14_传智播客iOS视频教程_instancetype
- LeetCode Copy List with Random Pointer
- 服务器共享文件和电脑同步,云服务器共享文件夹同步
- JavaOne 2016 Essentials:7个您不容错过的事件和会话
- C++ multimap的插入
- HDU 6113 度度熊的01世界【DFS/Flood Fill】
- 高考平行报志愿计算机录取规则,高考平行志愿录取规则是什么
- python framework jdon_python – Django Rest Framework和JSONField
- span width无效
- DEVONthink Pro作为浏览器插件脚本,如何使用
- 计算机的屏幕为什么成黑色,电脑液晶显示器老是黑屏怎么回事
- 十月的天气 风吹过你的气息
- 眨眼网杨莹,能写代码能玩时尚的美女CEO-搜狐
- 无线打印机与手机连接到服务器,图文详解手机通过无线Wifi连接打印机的方法...
- RIDE中testcase的edit界面显示异常/空白
- c语言:模拟用户密码登录
- lamport面包店算法详细讲解及代码实现
- 服务器网口修改为百兆,服务器千兆网口能否设置为百兆
- matlab如何查看眼图q值,详解:什么是眼图、眼图怎么看?
- css实现聊天气泡对话框
热门文章
- 清除用友所有单据锁定的SQL语句
- Disabling Shortcut Keys in Full Screen mode
- GIS软件开发工具包TatukGIS Developer Kernel 发布 v11.3.0-Unstable1丨附下载 1
- PHP面向对象(OOP)----分页类 1
- git学习资料及心得
- ylbtech-LanguageSamples-Struct(结构)
- 启动和停止一个服务,修改服务的启动类型 Start and Stop Service for windows
- 【Linux下Inotify + Rsync文件实时同步】
- python十进制转二进制,八进制和十六进制
- 修改smb默认端口_centos7 ssh端口更改方法