平衡树的问题,很容易想到中序遍历

那么我们给每一个节点记录一下中序遍历中它子树所在的区间,一次旋转显然只会改变两个节点的值

对于询问我们用线段树区间求积就可以了

#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 尺树寸泓相关推荐

  1. jzoj5662 [GDOI2018Day1模拟4.17]尺树寸泓

    Description 给定一棵splay,每个节点都有一个权值,节点x的价值为以x为根的子树中所有节点的权值和 分别有一下三种操作: 0 x:将x节点左旋 1 x:将x节点右旋 2 x:查询节点x所 ...

  2. 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 ...

  3. [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 ...

  4. 【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 旋转操 ...

最新文章

  1. Ext.widgets-Button,SplitButton,CycleButton
  2. WINDOWS2003域控制器禁止U盘
  3. 阿里P8架构师谈:架构设计经验汇总
  4. MySQL数据库安装Version5.7
  5. HTML网页设计综合题,网页设计(Html5)试题C卷
  6. 如何在自己开发的android应用中添加广告
  7. Hive学习之Metastore及其配置管理
  8. uv422转换为yuv420_详解 YUV 格式(I420/YUV420/NV12/NV12/YUV422)
  9. 数字图像处理(三):函数fspecial
  10. 语音(一)| 语音识别基础(深度解析)
  11. R countcolors包:像素级分析处理图片
  12. python —— 使用sympy模块求解数学方程
  13. PowerJob 的自实现高可用方案,妙妙妙!
  14. web常见错误解决方法
  15. CainAbel工具的下载和使用
  16. 0x0000000000指令引用的0x00000000内存。该内存不能为read
  17. 不使用函数实现字符串拼接函数strcat
  18. uniapp微信小程序富文本编辑器组件
  19. 管理DistributionLogistics - 进出口ERP解决方案
  20. 墨尔本大学计算机专业的课程,墨尔本大学计算机课程怎么样

热门文章

  1. java获取音频驱动程序_驱动程序---音频 MDD 和 PDD
  2. 大朗机器人餐厅在哪里_获得海内外一致好评,送餐机器人为中国餐饮打开新世界...
  3. security center启动类型更改不了_Word 启动缓慢解决方法
  4. python水仙花数的编程讲解_《scratch编程+数学》课程:找寻水仙花数
  5. 数据挖掘如何计算相关性_一份数据挖掘入门指南!!!
  6. 风变Python6---布尔值,break,continue,pass,else等语句的学习
  7. linux 用户设密码,linux 上添加用户,设置密码
  8. exchange无法收发邮件_MAPI session超过Exchange最大限制,邮件发送失败的终极解决方法...
  9. 数据挖掘对客户进行深入分析
  10. Leetcode-496-下一个更大元素 I