Jzoj5662 尺树寸泓
2024-06-12 14:02:57
平衡树的问题,很容易想到中序遍历
那么我们给每一个节点记录一下中序遍历中它子树所在的区间,一次旋转显然只会改变两个节点的值
对于询问我们用线段树区间求积就可以了
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 200010
#define M 1000000007
#define LL long long
#define mid (l+r>>1)
#define ls l,mid,x<<1
#define rs mid+1,r,x<<1|1
using namespace std;
int clk,n,m,l[N],r[N],v[N];
int w[N],wl[N],wr[N],p[N],s[N],rk[N],rt;
int T[N<<2];
inline void ps(int x){s[x]=(s[l[x]]+s[r[x]]+v[x])%M;wl[x]=(l[x]?wl[l[x]]:rk[x]);wr[x]=(r[x]?wr[r[x]]:rk[x]);
}
inline void dfs(int x){if(l[x]) dfs(l[x]);w[++clk]=x; rk[x]=clk;if(r[x]) dfs(r[x]);ps(x);
}
inline void build(int l,int r,int x){if(l==r){ T[x]=s[w[l]]; return; }build(ls);build(rs);T[x]=((LL)T[x<<1]*T[x<<1|1])%M;
}
inline void update(int l,int r,int x,int p,int k){if(l==r){ T[x]=k; return; }if(p<=mid) update(ls,p,k); else update(rs,p,k);T[x]=((LL)T[x<<1]*T[x<<1|1])%M;
}
inline LL query(int l,int r,int x,int L,int R){if(L<=l && r<=R) return T[x];LL ans=1;if(L<=mid) ans=ans*query(ls,L,R)%M;if(mid<R) ans=ans*query(rs,L,R)%M;return ans;
}
int main(){freopen("splay.in","r",stdin);freopen("splay.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1;i<=n;++i){scanf("%d%d%d",v+i,l+i,r+i);p[l[i]]=i; p[r[i]]=i;}for(int i=1;i<=n;++i) if(!p[i]) rt=i;dfs(rt); build(1,n,1);for(int o,x,y;m--;){scanf("%d%d",&o,&x);if(o==2) printf("%lld\n",query(1,n,1,wl[x],wr[x]));else{if(!o&&l[x]){y=l[x]; o=p[x];l[x]=r[y]; r[y]=x; if(l[x]) p[l[x]]=x; p[x]=y; p[y]=o;if(o){if(l[o]==x) l[o]=y; else r[o]=y;} else rt=y;ps(x); ps(y);update(1,n,1,rk[x],s[x]);update(1,n,1,rk[y],s[y]);} else if(o&&r[x]){y=r[x]; o=p[x];r[x]=l[y]; l[y]=x;if(r[x]) p[r[x]]=x; p[x]=y; p[y]=o;if(o){if(l[o]==x) l[o]=y; else r[o]=y;} else rt=y;ps(x); ps(y);update(1,n,1,rk[x],s[x]);update(1,n,1,rk[y],s[y]);}}}
}
转载于:https://www.cnblogs.com/Extended-Ash/p/9477107.html
Jzoj5662 尺树寸泓相关推荐
- jzoj5662 [GDOI2018Day1模拟4.17]尺树寸泓
Description 给定一棵splay,每个节点都有一个权值,节点x的价值为以x为根的子树中所有节点的权值和 分别有一下三种操作: 0 x:将x节点左旋 1 x:将x节点右旋 2 x:查询节点x所 ...
- JZOJ 5662. 【GDOI2018Day1模拟4.17】尺树寸泓
Description Input Output Sample Input 3 4 1 2 3 1 0 0 1 0 0 2 1 0 1 2 2 2 1 Sample Output 3 6 2 Data ...
- [Splay][线段树] jzoj P5662 尺树寸泓
Description Input Output Sample Input 3 4 1 2 3 1 0 0 1 0 0 2 1 0 1 2 2 2 1 Sample Output 3 6 2 Data ...
- 【2019/08/05测试 T2】尺树寸泓
传送门 problem 数据范围:点数 n n n 和操作数 Q Q Q 满足 1 ≤ n , Q ≤ 2 × 1 0 5 1≤n,Q≤2×10^5 1≤n,Q≤2×105. solution 旋转操 ...
最新文章
- Ext.widgets-Button,SplitButton,CycleButton
- WINDOWS2003域控制器禁止U盘
- 阿里P8架构师谈:架构设计经验汇总
- MySQL数据库安装Version5.7
- HTML网页设计综合题,网页设计(Html5)试题C卷
- 如何在自己开发的android应用中添加广告
- Hive学习之Metastore及其配置管理
- uv422转换为yuv420_详解 YUV 格式(I420/YUV420/NV12/NV12/YUV422)
- 数字图像处理(三):函数fspecial
- 语音(一)| 语音识别基础(深度解析)
- R countcolors包:像素级分析处理图片
- python —— 使用sympy模块求解数学方程
- PowerJob 的自实现高可用方案,妙妙妙!
- web常见错误解决方法
- CainAbel工具的下载和使用
- 0x0000000000指令引用的0x00000000内存。该内存不能为read
- 不使用函数实现字符串拼接函数strcat
- uniapp微信小程序富文本编辑器组件
- 管理DistributionLogistics - 进出口ERP解决方案
- 墨尔本大学计算机专业的课程,墨尔本大学计算机课程怎么样
热门文章
- java获取音频驱动程序_驱动程序---音频 MDD 和 PDD
- 大朗机器人餐厅在哪里_获得海内外一致好评,送餐机器人为中国餐饮打开新世界...
- security center启动类型更改不了_Word 启动缓慢解决方法
- python水仙花数的编程讲解_《scratch编程+数学》课程:找寻水仙花数
- 数据挖掘如何计算相关性_一份数据挖掘入门指南!!!
- 风变Python6---布尔值,break,continue,pass,else等语句的学习
- linux 用户设密码,linux 上添加用户,设置密码
- exchange无法收发邮件_MAPI session超过Exchange最大限制,邮件发送失败的终极解决方法...
- 数据挖掘对客户进行深入分析
- Leetcode-496-下一个更大元素 I