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
原创粉丝点击