2014多校7(1008)hdu4942(树的中序遍历+线段树)

Game on S♂play

Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 215    Accepted Submission(s): 36


Problem Description
Uncle Fang is learning Splay. When he heard about the rotate operation, he would like to play a game with Captain Chen. There is a tree with n nodes initially, and the node 1 is the root. The i-th nodes gets a weight of wi, and an attribute of interesting value defined as the sum of the weight of it’s descendants. Following are two operations in this tree:

1.do a rotation on a node x. The rotation is the common rotation in splay tree, it can be right-rotation or left-rotation, as demonstrated in the following picture. If it's impossible to rotate, just ignore it!


2.ask Captain Chen the product of interesting values of the nodes in a subtree rooted at node x.
 

Input
There are several cases.The first line of the input contains a single integer T (T <= 30) which is the number of test cases.Then comes the T test cases .

For each case, the first line contains two integer numbers n and m(1<=n, m<=100000).

The following n lines describe the tree. In the i-th line, there was three number wi, xi, yi,(0<=w<=100000, 0<=x, y<=n) indicate the weight of node i, the left child of node i, and the right child of node i. If xi or yi equals to 0, it means node i has no such child.

And the following m lines describe the operations. There are two numbers p x in each line. If p is 0, it means do right-rotation on node x; If p is 1, it means do left-rotation on node  x; if p is 2, it means ask the product of interesting values of the nodes in a subtree rooted at node x.
 

Output
For the k-th test case, first output “Case #k:” in a separate line.Then for each query,output a single num in each line after mod 1000000007.
 

Sample Input
   
   
1 3 4 1 2 3 1 0 0 1 0 0 2 1 0 1 2 2 2 1
 

Sample Output
   
   
Case #1: 3 6 2
Hint
As the input data may cause the stack overflow if you use some recursion solution. Add #pragma comment (linker,"/STACK:102400000,102400000") in C++ language.

题意:给你一棵二叉树,支持左旋右旋操作,然后查询一个点的有趣值(子树节点权值的乘积)

思路:由于只支持左旋右旋,可以注意到这两种操作是不会改变整棵树的中序遍历的,由于每次旋转只会改变两个节点的信息,故可以直接用数组维护各个节点的信息,包括左

右孩子和父亲(我就是因为在旋转以后只换了孩子而没有换父亲就无限WA了 sad~),而每个节点的子树都是整棵树中序序列上的一段连续的区间,故可以用线段树点更新来

维护一段区间的乘积,突然觉得这题挺简单的= =。。

#pragma comment (linker,"/STACK:102400000,102400000")
#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       
using namespace std;
#define maxn 100010
#define mod 1000000007
#define lson l,m,o<<1
#define rson m+1,r,o<<1|1

typedef pair
       
       
         pii; typedef __int64 ll; int chl[maxn]; int chr[maxn]; int chll[maxn]; int chrr[maxn]; int mid[maxn]; int fa[maxn]; int ww[maxn]; int ha[maxn]; ll sum[maxn]; int root; int n,m; int d; ll tree[maxn<<2]; void pushup(int o) { tree[o]=tree[o<<1]*tree[o<<1|1]%mod; } void build() { memset(tree,0,sizeof(tree)); } void update(int l,int r,int o,int p,ll v) { if(l==r) { tree[o]=v; return; } int m=l+r>>1; if(p<=m)update(lson,p,v); else update(rson,p,v); pushup(o); } ll query(int l,int r,int o,int L,int R) { if(L<=l&&r<=R) { return tree[o]; } int m=l+r>>1; ll ans=1; if(L<=m)ans=query(lson,L,R); if(m 
         
       
      
      
     
     
    
    
   
   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值