hdu 5039 未通过

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <string>
#include <map>

using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 30010;
int sum[maxn<<2],add[maxn<<2],cnt[maxn][2],t,n;
map<string,int> id;
struct edge {
       int from,to,v;
       edge(int a=0,int b=0,int c=0):from(a),to(b),v(c){}
};
vector<edge> edges;
vector<int> G[maxn];

void init() {
     edges.clear();
     for (int i = 0; i < maxn; i++) G[i].clear();
     memset(sum,0,sizeof(sum));
     memset(add,0,sizeof(add));
     for (int i = 1; i < maxn; i++) cnt[i][0] = INF, cnt[i][1] = 0;
}
void addedge(int from,int to,int v) {
     edges.push_back(edge(from,to,v));
     edges.push_back(edge(to,from,v));
     int m = edges.size();
     G[from].push_back(m-2);
     G[to].push_back(m-1);
}

void pushdown(int rt,int l1,int r1,int l2,int r2) {
     if (add[rt]) {
        sum[rt<<1] = r1-l1+1-sum[rt<<1];
        sum[rt<<1|1] = r2-l2+1-sum[rt<<1|1];
        add[rt<<1] ^= add[rt];
        add[rt<<1|1] ^= add[rt];
        add[rt] = 0;
     }
}

void update(int l,int r,int L,int R,int c,int rt) {
     if (l <= L && R <= r) {
         sum[rt] = (R-L+1-sum[rt]);
         add[rt] ^= c;
         return;
     }
     int mid = (L+R)>>1;
     pushdown(rt,L,mid,mid+1,R);
     if (l <= mid) update(l,r,L,mid,c,rt<<1);
     if (r > mid) update(l,r,mid+1,R,c,rt<<1|1);
     sum[rt] = sum[rt<<1]+sum[rt<<1|1];
}

void dfs(int u,int fa) {
     for (int i = 0; i < G[u].size(); i++) {
        edge e = edges[G[u][i]];
        if (e.to == fa) continue;
        dfs(e.to,u);
        cnt[e.to][0] = min(cnt[e.to][0],e.to);
        cnt[e.to][1] = max(cnt[e.to][1],e.to);
        if (e.v == 1) update(cnt[e.to][0],cnt[e.to][1],1,n,e.v,1);
        cnt[u][0] = min(cnt[e.to][0],cnt[u][0]);
        cnt[u][1] = max(cnt[e.to][1],cnt[u][1]);
     }
}

int main()
{
    int kase = 0;
    scanf ("%d",&t);
    while(t--) {
        scanf ("%d",&n);
        string s;
        init();
        id.clear();
        for (int i = 1; i <= n; i++) {
            cin >> s;
            id[s] = i;
        }
        string w;
        int v;
        for (int i = 1; i <= n-1; i++) {
            cin >> s >> w >> v;
            addedge(id[s],id[w],v);
        }
        dfs(1,-1);
        int q;
        scanf ("%d",&q);
        printf ("Case #%d:\n",++kase);
        while(q--) {
            cin >>  s;
            if (s[0] == 'Q') {
                printf ("%d\n",2*sum[1]*(n-sum[1]));
            }
            else {
                int p;
                scanf ("%d",&p);
                edge e = edges[2*(p-1)];
                int to = max(e.from,e.to);
                update(cnt[to][0],cnt[to][1],1,n,1,1);
            }
        }
    }
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/kwahia/article/details/81200241
今日推荐