zoukankan      html  css  js  c++  java
  • J

    题意:给一颗树,两种操作,查询 i 结点的颜色,和将i结点和它的子树都染成另一种颜色

    题解:dfs序构建线段树,对于x和其子树染色就是 l[x] 和 r[x];

    dfs序线段树板子

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    #include<list>
    #include<math.h>
    #include<vector>
    #include<stack>
    #include<string>
    #include<stdio.h>
    
    using namespace std;
    typedef long long LL;
    const int MAXN = 1e5 + 10;
    
    vector<int>vec[MAXN];
    int cnt[MAXN],l[MAXN],r[MAXN],vis[MAXN];
    int st[MAXN << 2];
    void init() {
        memset(l,-1,sizeof l);
        memset(r, -1 ,sizeof r);
        memset(cnt, 0, sizeof cnt);
        memset(vis, 0, sizeof vis);
    }
    
    void dfs(int x,int &pos) {
        l[x] = pos ++;
        for(int i = 0; i < vec[x].size(); i++) {
            dfs(vec[x][i],pos);
        }
        r[x] = pos++;
    }
    void build(int o,int l,int r) {
        st[o] = -1;
        if(l == r) return;
        int mid = (l + r) >> 1;
        build(o << 1, l , mid);
        build(o << 1 | 1, mid + 1, r);
    }
    void pushdown(int o) {
        if(st[o] != -1) {
            st[o << 1] = st[o];
            st[o << 1 | 1 ] = st[o];
            st[o] = -1;
        }
    }
    int query(int o,int l,int r,int x) {
        if(l == r) return st[o];
        pushdown(o);
        int mid = (l + r) >> 1;
        if(x <= mid) query(o << 1, l, mid, x);
        else query(o << 1 | 1, mid + 1, r, x);
    }
    void update(int o,int l,int r,int ql,int qr,int y) {
        if(ql <= l && r  <= qr) {
            st[o] = y;
            return;
        }
        pushdown(o);
        int mid = (l + r) >> 1;
        if(ql <= mid) update(o << 1, l, mid, ql, qr, y);
        if(qr >= mid + 1) update(o << 1 | 1, mid + 1, r, ql, qr, y);
    }
    int main() {
        int t, _ = 1;
        scanf("%d", &t);
        while (t--) {
            init();
            printf("Case #%d:
    ", _++);
            int n;
            scanf("%d", &n);
            for(int i = 1; i <= n; i++)
                vec[i].clear();
            build(1, 1, 2 * n);
            int u, v;
            for (int i = 1; i < n; i++) {
                scanf("%d %d", &u, &v);
                vec[v].push_back(u);
                cnt[u]++;
            }
            int pos = 1;
            for (int i = 1; i <= n; i++) {
                if (cnt[i] == 0) {
                    dfs(i,pos);
                    break;
                }
            }
    //        for(int i = 1;i<=n;i++)
    //            printf("%d %d %d
    ",i,l[i],r[i]);
    
            int m;
            scanf("%d",&m);
            while (m--) {
                char s[5];
                int x,y;
                scanf("%s",s);
                if(s[0] == 'C') {
                    scanf("%d",&x);
                    printf("%d
    ",query(1,1,2 * n,l[x]));
                } else {
                    scanf("%d %d",&x,&y);
                    update(1, 1, 2 * n, l[x],r[x], y);
                }
            }
        }
    }
    
    /*
    
    1
    5
    4 3
    3 2
    1 3
    5 2
    5
    C 3
    T 2 1
    C 3
    T 3 2
    C 3
    
    
     */
  • 相关阅读:
    mysql清空表中内容
    Proteus元件查找
    HDG12864F1 proteus仿真取模【PCtoLCD完美版】
    OLED取模(汉字加图片)
    Failed to connect to ESP8266: Timed out waiting for packet header
    AD常用快捷键
    Authentication method 'caching_sha2_password' not supported by any of the available plugins.
    spark阶段学习总结(三)
    spark阶段学习总结(一)
    spark阶段学习总结(二)
  • 原文地址:https://www.cnblogs.com/smallhester/p/11334761.html
Copyright © 2011-2022 走看看