pku 2528 Mayor’s posters-線段樹+離散化

來源:互聯網
上載者:User

第一道離散化是題目,不過這離散也太容易了,不用考慮衝突問題,不用記錄

其它距離之類的資料,不過這道題有個囧地方(至少囧到我了),就是樹的數組開3*N

不夠,因為我以前都是開3*N,沒出現過問題,這題把寫完後WA了,真有點無語,

因為就覺得思路是沒問題的,後來百度下,發現別人都開4*N的,後來想了想,上思修時

在紙上畫了差不多一節課,發現根本原因:總的來說對於線段樹最壞開到4*N就定沒問題

因為它的結構是一個完全二叉樹,當(N-1)是2的n次方是就是情況最差的時候,這時必須

開4*N才可以,不然下標一寫會越界,最好像9那樣最後【9,10)這個結點在樹中的下標是31!(應該是)

這次得好好記住才行,以後都開4*N

 

最後對於這一題和pku 2777差不多,就多了個離散化,而且還是最簡單的離散化

代碼:

 

#include<iostream><br />#include<cstring><br />#include<cstdlib><br />#define N 10005</p><p>using namespace std;</p><p>struct elem {<br />int s;<br />int t;<br />};</p><p>struct node {<br />int l;<br />int r;<br />int pos;<br />};</p><p>int n,count;<br />elem arr[N];<br />node tree[8*N];<br />int index[2*N],len;<br />int mark[N];<br />int flag;<br />int cmp(const void *a,const void *b)<br />{<br />return *(int *)a-*(int *)b;<br />}</p><p>void disc()<br />{<br />int i;<br />int a,b;<br />for(i = 0;i < n;i++){<br />cin >>a >>b;<br />arr[i].s = a; arr[i].t = b;<br />index[2*i] = a;index[2*i+1] = b;<br />}<br />qsort(index,2*n,sizeof(index[0]),cmp);<br />len = 0;<br />for(i = 1;i < 2*n;i++){<br /> if(index[i] != index[i-1]){<br /> index[++len] = index[i];<br />}<br />}<br />//for(i = 1;i <= len;i++){<br />//cout <<index[i] <<' ';<br />//}<br />//cout <<endl;<br />return ;<br />}</p><p>int find(int a)<br />{<br />int mid;<br />int base = 0,top = len;<br />while(base <= top){<br />mid = (base+top)/2;<br />if(a > index[mid])<br />base = mid+1;<br />else if(a < index[mid])<br />top = mid-1;<br />else return mid+1;<br />}<br />return 0;<br />}</p><p>void buid_tree(int k,int left,int right)<br />{flag = k;<br />int mid;<br />int L,R;<br />tree[k].l = left; tree[k].r = right;<br />tree[k].pos = 0;<br />if(tree[k].r-tree[k].l == 1){<br /> return ;<br />}<br />mid = (tree[k].l+tree[k].r)/2;<br />L = k<<1; R = L+1;<br />buid_tree(L,left,mid);<br />buid_tree(R,mid,right);<br />return ;<br />}</p><p>void tree_insert(int k,int left,int right,int data)<br />{<br />int mid;<br />int L,R;<br />if(tree[k].pos == data)<br />return ;<br />if(left <= tree[k].l && right >= tree[k].r){<br /> tree[k].pos = data;<br /> return;<br />}<br />L = k<<1; R = L+1;<br />if(tree[k].pos){<br />tree[L].pos = tree[R].pos = tree[k].pos;<br />tree[k].pos = 0;<br />}<br />mid = (tree[k].l+tree[k].r)/2;<br />if(left < mid) tree_insert(L,left,right,data);<br />if(right > mid) tree_insert(R,left,right,data);<br />return ;<br />}</p><p>void tree_search(int k)<br />{<br />int L,R;<br />if(tree[k].pos){<br />if(!mark[tree[k].pos]){<br />count++;<br />mark[tree[k].pos] = 1;<br />}<br />return ;<br />}<br />if(tree[k].r-tree[k].l == 1)<br />return ;<br />L = k<<1; R = L+1;<br />tree_search(L);<br />tree_search(R);<br />return ;<br />}</p><p>int main()<br />{<br />int tcase;<br />int i;<br />cin >>tcase;//cout <<&count <<' ' <<&tree[60030].r <<endl;<br />while(tcase--){<br /> cin >>n;<br />disc();<br />buid_tree(1,1,20000+1);cout <<flag <<endl;<br />for(i = 0;i < n;i++){<br />tree_insert(1,find(arr[i].s),find(arr[i].t)+1,i+1);<br />}<br />memset(mark,0,sizeof(mark));<br />count = 0;<br />tree_search(1);<br />cout <<count<<endl;<br />}<br />return 0;<br />}

聯繫我們

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