poj3321—樹狀數組

來源:互聯網
上載者:User

先確定節點關係,使每個節點都用一個線段表示,begin表示起始位置,end表示結束位置在樹上搜尋確定。然後就是純樹狀數組模板了。

這道題卡vector最好不用。

#include<cstdio>#include<vector>#include<cstring>#include<algorithm>using namespace std;#define N 100005struct TNode{int to,next;}nod[2*N];int n,m,edges;bool apple[N],vis[N];int f[N],cal[N],begin[N],end[N];void addedge(int u,int v) {nod[edges].to=v;nod[edges].next=f[u];f[u]=edges++;}void dfs(int u){    edges++;    begin[u]=edges; vis[u]=1;for(int i=f[u];i!=-1;i=nod[i].next){        if(!vis[nod[i].to])            dfs(nod[i].to);    }    end[u]=edges;}int lowbit(int x) {return x&(-x);}int getsum(int x) {    int s=0;    for(;x>0;x-=lowbit(x)) s+=cal[x];    return s;}void update(int x,int value){    for(;x<=n;x+=lowbit(x)) cal[x]+=value;}int main() {    int i,u,v;    char str[5];    scanf("%d",&n);memset(f,-1,sizeof(f));    memset(vis,0,sizeof(vis));    memset(apple,1,sizeof(apple));edges=0;    for(i=1;i<n;i++){        scanf("%d%d",&u,&v);        addedge(u,v);addedge(v,u);    }    edges=0;dfs(1);    for(i=1;i<=n;i++) update(i,1);    scanf("%d",&m);    while(m--){        scanf("%s%d",str,&u);        if(str[0]=='C') {            if(apple[u]){                update(begin[u],-1);                apple[u]=0;            }            else {                update(begin[u],1);                apple[u]=1;            }        }        else printf("%d\n",getsum(end[u])-getsum(begin[u]-1));    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.