码迷,mamicode.com
首页 > 其他好文 > 详细

未完成2130

时间:2017-09-14 23:42:14      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:ret   argv   bool   bsp   build   har   scan   logs   []   

#include <cstdio>
#define N 100005
bool now[N];
int nextt[N<<1],to[N<<1],head[N],cnt,n,q,tim,siz[N],fa[N],dep[N],belong[N],top[N];
struct Segment
{
    int l,r,mid,sum,flag;
    Segment *ch[2];
    Segment()
    {
        ch[0]=ch[1]=NULL;
        flag=0;
    }
}*root=new Segment;
void dfs1(int x)
{
    siz[x]=1;
    dep[x]=dep[fa[x]]+1;
    for(int i=head[x];i;i=nextt[i])
    {
        int v=to[i];
        if(fa[x]!=v)
        {
            fa[v]=x;
            dfs1(v);
            siz[x]+=siz[v];
        }
    }
}
void dfs2(int x)
{
    if(!top[x]) top[x]=x;
    int t=0;
    belong[x]=++tim;
    for(int i=head[x];i;i=nextt[i])
    {
        int v=to[i];
        if(fa[x]!=v&&siz[t]<siz[v]) t=v;
    }
    if(t) top[t]=top[x],dfs2(t);
    for(int i=head[x];i;i=nextt[i])
    {
        int v=to[i];
        if(fa[x]!=v&&v!=t) dfs2(v);
    }
}
inline void pushup(Segment *&k) {k->sum=k->ch[0]->sum+k->ch[1]->sum;}
void build(Segment *&k,int l,int r)
{
    k=new Segment;
    k->l=l;k->r=r;
    if(l==r) return;
    k->mid=(l+r)>>1;
    build(k->ch[0],l,k->mid);
    build(k->ch[1],k->mid+1,r);
    pushup(k);
}
void swap(int &m,int &n)
{
    int tmp=n;
    n=m;
    m=tmp;
}
void pushdown(Segment *&k)
{
    if(k->flag==1)
    {
        k->ch[0]->flag=k->flag;
        k->ch[0]->sum=k->ch[0]->r-k->ch[0]->l+1;
        k->ch[1]->flag=k->flag;
        k->ch[1]->sum=k->ch[1]->r-k->ch[1]->l+1;
        k->flag=0;
    }
    else
    {
        k->ch[0]->flag=k->flag;
        k->ch[0]->sum=0;
        k->ch[1]->flag=k->flag;
        k->ch[1]->sum=0;
        k->flag=0;    
    }
}
int Tree_Query(Segment *&k,int l,int r)
{
    if(k->l==l&&k->r==r) return k->sum;
    if(k->flag) pushdown(k);
    if(l>k->mid) return Tree_Query(k->ch[1],l,r);
    else if(r<=k->mid) return Tree_Query(k->ch[0],l,r);
    else return Tree_Query(k->ch[0],l,k->mid)+Tree_Query(k->ch[1],k->mid+1,r);
    pushup(k);
}
void Tree_Change(Segment *&k,int l,int r,int opt)
{
    if(k->l==l&&k->r==r)
    {
        k->flag=opt;
        if(opt==1) k->sum=r-l+1;
        else k->sum=0;
        return;
    }
    if(k->flag) pushdown(k);
    if(l>k->mid) Tree_Change(k->ch[1],l,r,opt);
    else if(r<=k->mid) Tree_Change(k->ch[0],l,r,opt);
    else Tree_Change(k->ch[0],l,k->mid,opt),Tree_Change(k->ch[1],k->mid+1,r,opt);
    pushup(k);
}
int Chain_Query(int x,int y)
{
    int ret=0;
    for(;top[x]!=top[y];x=fa[top[x]])
    {
        if(dep[top[x]]<dep[top[y]]) swap(x,y);
        ret+=Tree_Query(root,belong[top[x]],belong[x]);
    }
    if(dep[x]<dep[y]) swap(x,y);
    ret+=Tree_Query(root,belong[y],belong[x]);
    return ret;
}
void Chain_Change(int x,int y,int opt)
{
    for(;top[x]!=top[y];x=fa[top[x]])
    {
        if(dep[top[x]]<dep[top[y]]) swap(x,y);
        Tree_Change(root,belong[top[x]],belong[x],opt);
    }
    if(dep[x]<dep[y]) swap(x,y);
    Tree_Change(root,belong[y],belong[x],opt);
}
inline void ins(int u,int v)
{
    nextt[++cnt]=head[u];
    to[cnt]=v;
    head[u]=cnt;
}
int Main()
{
    scanf("%d",&n);
    for(int pr,i=2;i<=n;++i)
    {
        scanf("%d",&pr);
        ins(i,++pr);
        ins(pr,i);
    }
    dfs1(1);
    dfs2(1);
    build(root,1,n);
    scanf("%d",&q);
    char opt[20];
    for(int x;q--;)
    {
        scanf("%s%d",opt,&x);++x;
        if(opt[0]==i)
        {
            int ans=Chain_Query(1,x);
            Chain_Change(1,x,1);
            printf("%d\n",dep[x]-ans);
        }
        else 
        {
            int ans=Tree_Query(root,belong[x],belong[x]+siz[x]-1);
            Tree_Change(root,belong[x],belong[x]+siz[x]-1,2);
            printf("%d\n",ans);
        }
    }
    return 0;
}
int sb=Main();
int main(int argc,char *argv[]) {;}

 

未完成2130

标签:ret   argv   bool   bsp   build   har   scan   logs   []   

原文地址:http://www.cnblogs.com/ruojisun/p/7523368.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!