zoukankan      html  css  js  c++  java
  • J

    思路:一眼秒思路<(* ̄▽ ̄*)/
    dfs序+线段树。
    通过dfs序把树上问题转化成线段上的问题。然后用线段树解决。
     
     错因:都是些zz的错误就不说了
     
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define MAXN 50010
    using namespace std;
    int t,n,m;
    int sz,tot,sum,root;
    int to[MAXN*2],net[MAXN*2],head[MAXN];
    int dad[MAXN],idl[MAXN],idr[MAXN],edge[MAXN];
    struct nond{
        int l,r,flag;
    }tree[MAXN*4];
    void add(int u,int v){
        to[++tot]=v;net[tot]=head[u];head[u]=tot;
    }
    void build(int now,int l,int r){
        tree[now].l=l;tree[now].r=r;
        tree[now].flag=-1;
        if(tree[now].l==tree[now].r)    return ;
        int mid=(tree[now].l+tree[now].r)/2;
        build(now*2,l,mid);
        build(now*2+1,mid+1,r);
    }
    void down(int now){
        tree[now*2].flag=tree[now*2+1].flag=tree[now].flag;
        tree[now].flag=-1;
        return ;
    }
    void change(int now,int l,int r,int pos){
        if(tree[now].l==l&&tree[now].r==r){
            tree[now].flag=pos;
            return ;
        }
        if(tree[now].flag!=-1)    down(now);
        int mid=(tree[now].l+tree[now].r)/2;
        if(r<=mid)    change(now*2,l,r,pos);
        else if(l>mid)    change(now*2+1,l,r,pos);
        else { change(now*2,l,mid,pos);change(now*2+1,mid+1,r,pos); }
    }
    int query(int now,int x){
        if(tree[now].l==tree[now].r)
            return tree[now].flag;
        if(tree[now].flag!=-1)    down(now);
        int mid=(tree[now].l+tree[now].r)/2;
        if(x<=mid)    return query(now*2,x);
        else return query(now*2+1,x);
    }
    void dfs(int now){
        idl[now]=++sz;
        for(int i=head[now];i;i=net[i])
            if(dad[now]!=to[i]){
                dad[to[i]]=now;
                dfs(to[i]);
            }
        idr[now]=++sz;
    }
    int main(){
        scanf("%d",&t);
        while(t--){
            sum++;printf("Case #%d:
    ",sum);
            scanf("%d",&n);tot=0;
            for(int i=1;i<n;i++){
                int u,v;
                scanf("%d%d",&u,&v);
                add(v,u);edge[u]++;
            }
            for(int i=1;i<=n;i++)
                if(edge[i]==0){ root=i;break; }
            dfs(root);build(1,1,sz);
            scanf("%d",&m);
            for(int i=1;i<=m;i++){
                char c;int x,y;
                scanf("
    %c%d",&c,&x);
                if(c=='T'){
                    scanf("%d",&y);
                    change(1,idl[x],idr[x],y);
                }
                else    printf("%d
    ",query(1,idl[x]));
            }
            root=0;sz=0;
            memset(to,0,sizeof(to));
            memset(idl,0,sizeof(idl));
            memset(idr,0,sizeof(idr));
            memset(net,0,sizeof(net));
            memset(dad,0,sizeof(dad));
            memset(edge,0,sizeof(head));
            memset(head,0,sizeof(head));
        }
    }
    /*
    1 
    5 
    4 3 
    3 2 
    1 3 
    5 2 
    5 
    C 3 
    T 2 1
     C 3 
    T 3 2 
    C 3
    */
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    笑话(真人真事)一则
    Object Builder中的Locator究竟是不是采用Composite的模式之我见
    C++AndC#我的程序员之路
    C#中各种十进制数的转换
    使用GotDotnet workSpace手记
    检索 COM 类工厂中 CLSID 为 {0002450000000000C000000000000046} 的组件失败
    CSS如何让同一行的图片和文字垂直居中对齐(FF,Safari,IE都通过)
    怎样练习一万小时成为顶级高手?
    CSS控制大小写
    做SEO权重计算公式
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/8470236.html
Copyright © 2011-2022 走看看