zoukankan      html  css  js  c++  java
  • bzoj1103[POI2007]大都市meg

    bzoj1103[POI2007]大都市meg

    题意:

    一个n点树,根节点为1,初始时全部边为土路,共n-m+1次操作,每次可将一条边改为公路或求根节点到某个节点要几个多少土路。n,m≤250000

    题解:

    先求出DFS序,进入节点在时间点的权值为1,离开节点在时间点的权值为-1,如果把公路转成土路就将这条边的左端点的进入时间权值和离开时间权值都置为0,如果询问则输出节点进入时间前缀和。求前缀和及修改的操作可以用树状数组维护。

    代码:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <queue>
     5 #define inc(i,j,k) for(int i=j;i<=k;i++)
     6 #define maxn 250500
     7 #define lb(x) x&-x
     8 using namespace std;
     9 
    10 struct e{int t,n;}; e es[maxn]; int g[maxn],ess;
    11 void pe(int f,int t){
    12     es[++ess]=(e){t,g[f]}; g[f]=ess;
    13 }
    14 int st[maxn*2],l[maxn],r[maxn],tim;
    15 void dfs(int x){
    16     st[++tim]=x; l[x]=tim;
    17     for(int i=g[x];i;i=es[i].n)dfs(es[i].t);
    18     st[++tim]=x; r[x]=tim;
    19 }
    20 inline int read(){
    21     char ch=getchar(); int f=1,x=0;
    22     while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    23     while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    24     return f*x;
    25 }
    26 int c[maxn*2],n;
    27 void update(int x,int v){while(x<=n*2)c[x]+=v,x+=lb(x);}
    28 int query(int x){int q=0; while(x)q+=c[x],x-=lb(x); return q;}
    29 int main(){
    30     n=read(); inc(i,1,n-1){int a=read(),b=read(); pe(a,b);}
    31     dfs(1); inc(i,1,n)update(l[i],1),update(r[i],-1);
    32     int m=read(); char opt[3];
    33     inc(i,1,n+m-1){
    34         scanf("%s",opt);
    35         if(opt[0]=='W'){int a=read(); printf("%d
    ",query(l[a])-1);}
    36         if(opt[0]=='A'){int a=read(),b=read(); update(l[b],-1); update(r[b],1);}
    37     }
    38     return 0;
    39 }

    20160608

  • 相关阅读:
    Android Zygote介绍
    Android binder介绍(下)
    Android binder介绍(上)
    Android init介绍(下)
    Android init介绍(上)
    Android 网络服务介绍
    Linux代理服务器使用
    Linux ALSA介绍
    ZigBee MAC层(下)
    ZigBee MAC层(上)
  • 原文地址:https://www.cnblogs.com/YuanZiming/p/5778173.html
Copyright © 2011-2022 走看看