BZOJ 3306: 树
2017-03-31 11:44
169 查看
这道题还是挺友善的。。
画画图就知道是什么回事了
分三种情况讨论。线段树按dfs序维护即可
黄学长说的挺清楚的
传送门
画画图就知道是什么回事了
分三种情况讨论。线段树按dfs序维护即可
黄学长说的挺清楚的
传送门
#include<bits/stdc++.h> using namespace std; const int N=100002,inf=1e9+7; inline int read() { char ch=getchar(); int x=0,f=1; while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0'; ch=getchar();} return x*f; } struct node{int y,next;}a ; int len,first ; void ins(int x,int y){a[++len]=(node){y,first[x]},first[x]=len;} int s ,e ,id,c ,mn[N<<2],f [18],dep ,d[20]; void dfs(int x) { s[x]=++id; for(int i=1;i<=17;i++) if(f[x][i-1])f[x][i]=f[f[x][i-1]][i-1]; else break; for(int k=first[x];k;k=a[k].next){ int y=a[k].y; f[y][0]=x,dep[y]=dep[x]+1,dfs(y); } e[x]=id; } void change(int x,int l,int r,int k,int u) { if(l==r){mn[x]=u; return;} int mid=(l+r)>>1,lc=x<<1,rc=lc|1; if(k<=mid)change(lc,l,mid,k,u); else change(rc,mid+1,r,k,u); mn[x]=min(mn[lc],mn[rc]); } int query(int x,int l,int r,int ql,int qr) { if(ql>qr)return inf; if(l==ql && r==qr)return mn[x]; int mid=(l+r)>>1,lc=x<<1,rc=lc|1; if(ql>mid)return query(rc,mid+1,r,ql,qr); else if(qr<=mid)return query(lc,l,mid,ql,qr); return min(query(lc,l,mid,ql,mid),query(rc,mid+1,r,mid+1,qr)); } int main() { int n=read(),m=read(),x,y,i; d[0]=1; for(i=1;i<=17;i++)d[i]=d[i-1]<<1; for(i=1;i<=n;i++) { x=read(),c[i]=read(); if(x)ins(x,i); } id=0; dfs(1); for(i=1;i<=n;i++)change(1,1,n,s[i],c[i]); int rt=1; char ch; for(i=1;i<=m;i++) { scanf("\n%c",&ch); if(ch=='V')x=read(),y=read(),change(1,1,n,s[x],y); else if(ch=='E')rt=read(); else { x=read(); if(x==rt)printf("%d\n",mn[1]); else if(s[x]<=s[rt] && e[x]>=e[rt]) { y=rt; for(int j=17;j>=0;j--)if(dep[y]-dep[x]>d[j])y=f[y][j]; printf("%d\n",min(query(1,1,n,1,s[y]-1),query(1,1,n,e[y]+1,n))); } else printf("%d\n",query(1,1,n,s[x],e[x])); } } return 0; }
相关文章推荐
- [bzoj3306]树 dfs序+线段树
- 【BZOJ-3306】树 线段树 + DFS序
- BZOJ 3306|树|树链剖分
- BZOJ 3306: 树
- bzoj 3306: 树
- 【BZOJ3083/3306】遥远的国度/树 树链剖分+线段树
- bzoj3083 3306
- [BZOJ3306]树
- 【bzoj3306】树
- [bzoj3306]树——树上倍增+dfs序+线段树
- BZOJ 3306 树
- BZOJ 3306: 树
- BZOJ3306 树
- cf588e & bzoj3306 树上倍增
- 【bzoj3306】 树 dfs序+线段树
- 【bzoj 3306】树
- 【bzoj3306】树
- 【BZOJ 3306】树【LCA、DFS序、线段树】
- bzoj 3306
- 【bzoj3306】【树】【dfs序+线段树】