HDU 4942 Game on S♂play(线段树、模拟、扩栈)
比赛的时候想到这题的大概做法,但由于卡别的水题。。。就赛后做了。。。
题意:给一个二叉树,每个结点有一个w[i],有3种操作,0 x表示左旋x,1 x表示右旋x,3 x表示询问x结点的价值,其中,价值为x子树结点的累加价值的累乘,其中,结点的累加价值为结点子树的Σw[i]。即询问是,∏Σw。
好像题意被我说得好渣好乱。。。。还是忽略上面2行吧。。。
首先,左旋右旋不影响中序遍历的index,即,可以把题目那2个图进行中序遍历,结果都是αXβYγ。由此,可以建立线段树。
而左旋右旋的过程模拟即可,可画示意图,将所有改变的一一写上。
要注意的是记得要改原本x跟父亲那条边,一开始没这个然后RE。。。。
#pragma comment (linker,"/STACK:102400000,102400000")
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; #define ll long long
#define maxn 100010
#define mod 1000000007 int son[maxn][2];
int fa[maxn];
int idx[maxn];
int real[maxn];
int lr[maxn][2];
int w[maxn];
ll val[maxn];
ll mul[maxn<<2];
void dfs(int x,int& dfn){
val[x] = w[x];
if(son[x][0]) dfs(son[x][0],dfn), lr[x][0]=lr[son[x][0]][0], val[x]+=val[son[x][0]];
else lr[x][0]=dfn+1;
idx[x] = ++dfn;
real[dfn]=x;
if(son[x][1]) dfs(son[x][1],dfn), lr[x][1]=lr[son[x][1]][1], val[x]+=val[son[x][1]];
else lr[x][1]=dfn;
val[x]%=mod;
}
void pushUp(int u){
mul[u] = mul[u<<1]*mul[u<<1|1]%mod;
}
void build(int u,int l,int r){
if(l==r){
mul[u] = val[real[l]];
return ;
}
int mid = (l+r)>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushUp(u);
}
ll query(int u,int l,int r,int L,int R){
if(l==L&&r==R) return mul[u];
int mid = (l+r)>>1;
if(R<=mid) return query(u<<1,l,mid,L,R);
else if(L>mid) return query(u<<1|1,mid+1,r,L,R);
return query(u<<1,l,mid,L,mid)*query(u<<1|1,mid+1,r,mid+1,R)%mod;
}
void update(int u,int l,int r,int pos,ll v){
if(l==r){
mul[u] = v;
return ;
}
int mid = (l+r)>>1;
if(pos<=mid) update(u<<1,l,mid,pos,v);
else update(u<<1|1,mid+1,r,pos,v);
pushUp(u);
}
void LR(int x,int op,int n){
if(son[x][op]==0) return ;
int y = son[x][op];
int bb = son[y][op^1], cc=son[y][op];
son[x][op]=bb;
fa[bb]=x;
int xx=fa[x];
if(son[xx][0]==x) son[xx][0]=y;
else son[xx][1]=y;
fa[y]=xx;
son[y][op^1]=x;
fa[x]=y;
if(bb) lr[x][op] = lr[bb][op];
else lr[x][op] = idx[x];
lr[y][op^1] = lr[x][op^1];
if(bb) val[x] = val[x]-val[y]+val[bb];
else val[x] = val[x]-val[y];
if(cc) val[y] = val[x]+val[cc]+w[y];
else val[y] = val[x]+w[y];
update(1,1,n,idx[x],val[x]);
update(1,1,n,idx[y],val[y]);
}
int main(){
int t,n,m,ca=0;
scanf("%d",&t);
while(t--){
printf("Case #%d:\n",++ca);
scanf("%d%d",&n,&m);
memset(fa,0,sizeof(fa));
son[0][0]=son[0][1]=0;
for(int i=1;i<=n;++i){
scanf("%d%d%d",w+i,son[i],son[i]+1);
fa[son[i][0]]=fa[son[i][1]]=i;
}
int dfn=0;
dfs(1,dfn);
build(1,1,n);
for(int i=0;i<m;++i){
int op,x;
scanf("%d%d",&op,&x);
if(op==2) printf("%I64d\n",query(1,1,n,lr[x][0],lr[x][1]));
else LR(x,op,n);
}
}
return 0;
}
HDU 4942 Game on S♂play(线段树、模拟、扩栈)的更多相关文章
- hdu 5274 Dylans loves tree(LCA + 线段树)
Dylans loves tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- HDU 3074.Multiply game-区间乘法-线段树(单点更新、区间查询),上推标记取模
Multiply game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- HDU 1394 Minimum Inversion Number(线段树求最小逆序数对)
HDU 1394 Minimum Inversion Number(线段树求最小逆序数对) ACM 题目地址:HDU 1394 Minimum Inversion Number 题意: 给一个序列由 ...
- hdu_5818_Joint Stacks(线段树模拟)
题目链接:hdu_5818_Joint Stacks 题意: 给你两个栈,多了个合并操作,然后让你模拟 题解: 很容易想到O(1)的单个栈操作,O(n)的合并操作,这样肯定超时,所以我们要将时间复杂度 ...
- 【CF280D】 k-Maximum Subsequence Sum ,线段树模拟费用流
昨天考试被教育了一波.为了学习一下\(T3\)的科技,我就找到了这个远古时期的\(cf\)题(虽然最后\(T3\)还是不会写吧\(QAQ\)) 顾名思义,这个题目其实可以建成一个费用流的模型.我们用流 ...
- 2019牛客暑期多校训练营(第八场)E:Explorer(LCT裸题 也可用线段树模拟并查集维护连通性)
题意:给定N,M,然后给出M组信息(u,v,l,r),表示u到v有[l,r]范围的通行证有效.问有多少种通行证可以使得1和N连通. 思路:和bzoj魔法森林有点像,LCT维护最小生成树. 开始和队友 ...
- [CSP-S模拟测试]:陶陶摘苹果(线段树维护单调栈)
题目传送门(内部题116) 输入格式 第一行两个整数$n,m$,如题 第二行有$n$个整数表示$h_1-h_n(1\leqslant h_i\leqslant 10^9)$ 接下来有$m$行,每行两个 ...
- hdu 1556:Color the ball(线段树,区间更新,经典题)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- HDU 1394 Minimum Inversion Number(线段树/树状数组求逆序数)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- HDU 5029 Relief grain(离线+线段树+启发式合并)(2014 ACM/ICPC Asia Regional Guangzhou Online)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5029 Problem Description The soil is cracking up beca ...
随机推荐
- fullPage 全屏滚动【上下滚动】效果
由于个人能力,研究了两天,终于写出来了. 又花了一天的时间成功的将30多行脚本,改成了70多行,我也是够有心的了. 那么接下来就是我制作这个效果的全部过程. 那一年我十七,她十八,在那个夏天里,我们, ...
- 基于iSCSI的SQL Server 2012群集测试(三)--SQL Server 2012群集安装总结
5.SQL Server 2012群集安装总结 5.1 群集与非群集的安装区别总结 SQL Server虚拟名称: 非群集环境下,本地服务器的名称就是SQL Server服务器名称:但在群集环境下,由 ...
- Hadoop Fsimage 和 editlog
在<Hadoop NameNode元数据相关文件目录解析>文章中提到NameNode的$dfs.namenode.name.dir/current/文件夹的几个文件: 1 current/ ...
- Linux 下新增虚拟内存
问题描述,电脑内存1G.在启用elasticsearch的时候,报错 Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memor ...
- jquery 平滑锚
setTimeout('$("html,body").animate({ scrollTop: $(".title").offset().top }, 1000 ...
- 如何在 CentOS 7 用 cPanel 配置 Nginx 反向代理
导读 Nginx 是最快和最强大的 Web 服务器之一,以其高性能和低资源占用率而闻名.它既可以被安装为一个独立的 Web 服务器,也可以安装成反向代理 Web 服务器.在这篇文章,我将讨论在安装了 ...
- cocos2d事件处理机制之我见
cocos2d是使用pyglet事件框架来处理事件的. 其中,包括分发器(发射器)和监听器两部分.下面形象的来打个比方. 这个机制就好比一把枪,三步:扣扳机(触发),上弹(注册),给子弹上***(这个 ...
- [BZOJ1901]Zju2112 Dynamic Rankings
[BZOJ1901]Zju2112 Dynamic Rankings 试题描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i ...
- 百度网盘爬虫Python
": for i in range((shares["total_count"]-1)/ONESHAREPAGE): try: dbcurr.execute('INSER ...
- centos6.5 网卡的处理
在centos安装后,找不到eth0/1 看了下dmesg | grep network的输出,发现不是驱动没有安装,而是重新命名了网卡. 1. 配置静态IP,修改 /etc/sysconfig/ne ...