zoukankan      html  css  js  c++  java
  • bzoj1103树状数组水题

    (卧槽,居然规定了修改的两点直接相连,亏我想半天)

    非常水的题,用dfs序(而且不用重复,应该是直接规模为n的dfs序)+树状数组可以轻松水

    收获:树状数组一遍A(没啥好骄傲的,那么简单的东西)

     1 #include <cstdio>
     2 #include <iostream>
     3 using namespace std;
     4 int N=0,n,m,p,q,a[300000],l[300000],pos[300000],end[300000],son[300000],bro[300000],h[300000];
     5 void add(int x,int y)
     6 {
     7     while(x<=N)
     8     {
     9         a[x]+=y;
    10         x+=x&-x;
    11     }
    12 }
    13 int get(int x)
    14 {
    15     int ans=0;
    16     while(x)
    17     {
    18         ans+=a[x];
    19         x-=x&-x;
    20     }
    21     return ans;
    22 }
    23 void build(int now)
    24 {
    25     l[++N]=now;pos[now]=N;
    26     for(int i=son[now];i;i=bro[i])
    27         h[i]=h[now]+1,build(i);
    28     end[now]=N+1;
    29 }
    30 int main()
    31 {
    32     scanf("%d",&n);
    33     for(int i=1;i<n;i++)
    34     {
    35         scanf("%d%d",&p,&q);
    36         if(p>q) swap(p,q);
    37         bro[q]=son[p];son[p]=q;
    38     }
    39     build(1);
    40     scanf("%d",&m);
    41     for(int i=1;i<=n+m-1;i++)
    42     {
    43         char ch=getchar();
    44         while(ch!='A' && ch!='W')
    45             ch=getchar();
    46         if(ch=='A')
    47         {
    48             scanf("%d%d",&p,&q);
    49             if(p>q) swap(p,q);
    50             add(pos[q],1),add(end[q],-1);
    51         }
    52         if(ch=='W')
    53         {
    54             scanf("%d",&p);
    55             printf("%d
    ",h[p]-get(pos[p]));
    56         }
    57     }
    58     return 0;
    59 } 
  • 相关阅读:
    JAVA日常之三
    java将字符串存入oracle的Blob中
    java连接oracle数据库
    JAVA日常之二
    JAVA日常之一
    linux日常命令之三
    linux日常命令之二
    linux日常命令之一
    Python之路【第四十篇】:django日更
    Python之路【第三十九篇】:django日更
  • 原文地址:https://www.cnblogs.com/wanglichao/p/5785353.html
Copyright © 2011-2022 走看看