BZOJ 3306: 树
来源:互联网 发布:工作站知乎 编辑:程序博客网 时间:2024/06/16 13:16
这道题还是挺友善的。。
画画图就知道是什么回事了
分三种情况讨论。线段树按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[N]; int len,first[N];void ins(int x,int y){a[++len]=(node){y,first[x]},first[x]=len;}int s[N],e[N],id,c[N],mn[N<<2],f[N][18],dep[N],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;}
1 0
- BZOJ 3306: 树
- BZOJ 3306|树|树链剖分
- BZOJ 3306: 树
- bzoj 3306: 树
- bzoj 3306: 树 dfs序+线段树
- BZOJ 3306 树 Link-Cut-Tree+set
- BZOJ 3674/BZOJ 3673 主席树
- bzoj 线段树专刊
- bzoj 1798 线段树
- BZOJ 3697 树分治
- bzoj 3589 动态树
- bzoj 3319: 黑白树
- BZOJ 4539: [Hnoi2016]树
- bzoj 4539: [Hnoi2016]树
- bzoj 3702: 二叉树
- BZOJ 1012 线段树
- BZOJ 3224 替罪羊树
- bzoj 3932(主席树)
- salt数据系统---grains
- 如何使用Spark的local模式远程读取Hadoop集群数据
- LeetCode: 11. Container With Most Water
- HDU 1213 How Many Tables 并查集
- 通过dt筛选符合条件的结果
- BZOJ 3306: 树
- ORS Visual医学影像三维处理软件简介
- linux exercise2
- 使用maven的tomcat插件部署项目
- 设计模式之适配器模式
- Java中实现多线程下载
- HDU 4198 Quick out of the Harbour(BFS+优先队列)
- 古今夫妻称谓
- Oracle Aix下安装实例DISPLAY not set.错误解决 dbca