J - Assign the task HDU - DFS序-线段树

  • J - Assign the task

  •  HDU - 3974 
  • 按照dfs序建树,区间更新点查询
  • #include<iostream>
    #include<stdio.h>
    #include<cstring>
    using namespace std;
    #define maxn 50020
    struct edg
    {
        int to,v;
    } edge[maxn];
    int head[maxn],tot,t;
    int cnt,start[maxn];
    int n,END[maxn],u,v;
    bool vis[maxn];
    struct node
    {
        int l,r,val,lazy;
    } tree[maxn*4];
    void init()
    {
        tot=cnt=0;
        memset(head,-1,sizeof(head));
        memset(vis,0,sizeof(vis));
    }
    void addedge(int u,int v)
    {
        edge[++tot].v=v;
        edge[tot].to=head[u];
        head[u]=tot;
    }
    void dfs(int u)
    {
        ++cnt;
        start[u]=cnt;
        for(int i=head[u]; i!=-1; i=edge[i].to)
            dfs(edge[i].v);
        END[u]=cnt;
    }
    void push_up(int root,int v)
    {
        tree[root].val=v;
        tree[root].lazy=1;
    }
    void push_down(int root)
    {
        if(tree[root].lazy)
        {
            push_up(root<<1,tree[root].val);
            push_up(root<<1|1,tree[root].val);
            tree[root].lazy = 0;
        }
    }
    void build(int i,int l,int r)
    {
        tree[i].l = l;
        tree[i].r = r;
        tree[i].val = -1;
        tree[i].lazy = 0;
        if(l == r)return;
        int mid = (l+r)/2;
        build(i<<1,l,mid);
        build((i<<1)|1,mid+1,r);
    }
    void update(int i,int l,int r,int v)
    {
        if(tree[i].l == l && tree[i].r == r)
        {
            push_up(i,v);
            return;
        }
        push_down(i);
        int mid = (tree[i].l + tree[i].r)/2;
        if(r <= mid)update(i<<1,l,r,v);
        else if(l > mid)update((i<<1)|1,l,r,v);
        else
        {
            update(i<<1,l,mid,v);
            update((i<<1)|1,mid+1,r,v);
        }
    }
    int query(int i,int u)
    {
        if(tree[i].l == u && tree[i].r == u)
            return tree[i].val;
        push_down(i);
        int mid = (tree[i].l + tree[i].r)/2;
        if(u <= mid)return query(i<<1,u);
        else return query((i<<1)|1,u);
    }
    int main()
    {
        scanf("%d",&t);
        for(int cas=1; cas<=t; cas++)
        {
            printf("Case #%d:\n",cas);
            init();
            scanf("%d",&n);
            for(int i = 1; i < n; i++)
            {
                scanf("%d%d",&u,&v);
                vis[u] = true;
                addedge(v,u);
            }
            for(int i = 1; i <= n; i++)
                if(!vis[i])
                {
                    dfs(i);
                    break;
                }
            build(1,1,cnt);
            char op[10];
            int m;
            scanf("%d",&m);
            while(m--)
            {
                scanf("%s",op);
                if(op[0] == 'C')
                {
                    scanf("%d",&u);
                    printf("%d\n",query(1,start[u]));
                }
                else
                {
                    scanf("%d%d",&u,&v);
                    update(1,start[u],END[u],v);
                }
            }
        }
        return 0;
    }

猜你喜欢

转载自blog.csdn.net/BePosit/article/details/83210532
今日推荐