poj 3321 Apple Tree(樹狀數組)

來源:互聯網
上載者:User

標籤:樹狀數組   資料結構   

輝煌北大的月賽題品質真高啊,這種樹狀數組真難想到。

樹狀數組的基本用法是區間,單點的應用,起初這個怎麼都想不到如何套用到樹狀數組。

轉化方法是 將樹上的節點資訊查詢,轉為深度優先中節點順序(代表結點編號)。進結點與出結點分別代表該結點管轄範圍。

題目大意級是說,給你一顆樹,最初每個節點上都有一個蘋果,有兩種操作:修改(即修改某一個節點,修改時這一個節點蘋果從有到無,或從無到有)和查詢(查詢某一個節點他的子樹上有多少個蘋果)。

由於此題資料比較大(N<=10^5),而且不是標準的二叉樹,所以這裡我們隊每一個節點重新編號,另外為每一個節點賦一個左值和一個右值,表示這個節點的管轄範圍。

也就是DFS搜尋的時候做標記的過程,這樣新的編號為1~6的節點所管轄的範圍分別就是[1,6]  [2,4]   [3,3]  [4,4]  [5,6]  [6,6],其中左邊的是左值,右邊的是右值,節點1的區間是[1,6],正好這棵子樹有6個節點,其他也一樣

#include<cstdio>#include<string> #include<string.h>#include<iostream>#include<algorithm> #include<map>#include<iterator>using namespace std;#define N 100010int n,m;int lowbit(int x){return -x&x;}void update(int *arr,int r,int num){int i;for(i=r;i<=n;i+=lowbit(i))arr[i]+=num;}int getsum(int *arr,int r){int i;int ans=0;for(i=r;i>0;i-=lowbit(i))ans+=arr[i];return ans;}int head[N];int next[N];int netb[N];int deh1[N];int deh2[N];int cnt,depth;int arr[N];int a[N];void init(){int i;//memset(a,0,sizeof(a));memset(deh1,0,sizeof(deh1));memset(head,-1,sizeof(head));cnt=0;depth=0;for(i=1;i<=n;i++)update(arr,i,1),a[i]=1;}void add(int u,int v){netb[cnt]=v;next[cnt]=head[u];head[u]=cnt++;}void dfs(int u){deh1[u]=++depth;//代表左int i;for(i=head[u];~i;i=next[i]){int v=netb[i];dfs(v);}deh2[u]=depth;//代表右}int main(){int i,j,k,u,v,m;char str[10];while(~scanf("%d",&n)){init();for(i=1;i<n;i++){scanf("%d%d",&u,&v);add(u,v);//add(v,u);}dfs(1);scanf("%d",&m);for(i=1;i<=m;i++){scanf("%s%d",str,&k);if(str[0]=='C') a[k]*=-1,update(arr,deh1[k],a[k]);//這裡用deh1[k]左邊也代表它的標號else {u=deh1[k]-1;v=deh2[k];k=getsum(arr,v)-getsum(arr,u);printf("%d\n",k);}}}return 0;}


poj 3321 Apple Tree(樹狀數組)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.