hdu 1540 Tunnel Warfare

來源:互聯網
上載者:User

做線段也做了不少題了,想看看自己什麼水平,就隨便找一道題來做,

誰知,還是不行,最後還是去百度,goole了,看了別人的解題報告才知道自己是多麼天真

自己的方法一點好似不靠邊,哎~~~~

 

這題說是經典的說,特別是它的查詢,覺得如果是自己從一片空白想出來還是真難的說,不過

看別人的代碼還是很容易理解的,繼續努力!!!!!

重大更新:

tree[k].ml = max(max(tree[L].ml,tree[R].ml),tree[L].rl+tree[R].ll);//當前結點最大長度ml,為左右結點ml及(左結點從右數連續長度+右結點從左數的連續長度)中的最大值<br />tree[k].ll = tree[L].ll;<br />if(tree[k].ll == mid-tree[k].l) tree[k].ll += tree[R].ll;//當前結點從左數的連續長度 = 左結點從左起的連續長度+(右結點從左起的連續長度(如果左結點全為連續))<br />tree[k].rl = tree[R].rl;<br />if(tree[k].rl == tree[k].r-mid) tree[k].rl += tree[L].rl;//同上

 

 

完整代碼:

#include<stdio.h><br />#define N 50005</p><p>struct node{<br /> int l;<br /> int r;<br /> int rl;<br /> int ll;<br /> int ml;<br /> void update(int data){<br /> rl = ll = ml = data;<br /> }<br />};</p><p>node tree[3*N];</p><p>int max(int a,int b)<br />{<br />return a > b? a:b;<br />}</p><p>void buid_tree(int k,int left,int right)<br />{<br />int mid;<br />int L,R;<br />tree[k].l = left; tree[k].r = right;<br />tree[k].ml = tree[k].ll = tree[k].rl = tree[k].r-tree[k].l;<br />if(tree[k].r-tree[k].l == 1)<br />return ;<br />mid = (tree[k].l+tree[k].r)/2;<br />L = 2*k; 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(left <= tree[k].l && right >= tree[k].r){<br />tree[k].update(data);<br />return ;<br />}<br />mid = (tree[k].l+tree[k].r)/2;<br />L = k<<1; R = L+1;<br />if(left < mid) tree_insert(L,left,right,data);<br />if(right > mid) tree_insert(R,left,right,data);<br />//重大更新<br />tree[k].ml = max(max(tree[L].ml,tree[R].ml),tree[L].rl+tree[R].ll);//當前結點最大長度ml,為左右結點ml及(左結點從右數連續長度+右結點從左數的連續長度)中的最大值<br />tree[k].ll = tree[L].ll;<br />if(tree[k].ll == mid-tree[k].l) tree[k].ll += tree[R].ll;//當前結點從左數的連續長度 = 左結點從左起的連續長度+(右結點從左起的連續長度(如果左結點全為連續))<br />tree[k].rl = tree[R].rl;<br />if(tree[k].rl == tree[k].r-mid) tree[k].rl += tree[L].rl;//同上<br />return ;<br />}</p><p>int tree_search(int k,int left,int right)<br />{<br />int mid;<br />int L,R;<br />if(left <= tree[k].l && right >= tree[k].r || tree[k].ml == tree[k].r-tree[k].l || !tree[k].ml){//當前結點長度為1時,無損時,全損時<br /> return tree[k].ml;<br />}<br />mid = (tree[k].l+tree[k].r)/2;<br />L = k<<1; R = L+1;<br />//查詢結點在左結點<br />if(left < mid){<br />if(left < mid-tree[L].rl)<br />return tree_search(L,left,right);//如果要查詢結點不在左結點從右起連續區間中,繼續查詢<br />else<br />return tree[R].ll+tree[L].rl;//如果在其中,則結果 = 左結點從右起連續區間長度+右結點從左起連續區間長度<br />}<br />if(right > mid){<br /> if(right > mid+tree[R].ll)<br /> return tree_search(R,left,right);<br /> else<br /> return tree[L].rl+tree[R].ll;<br />}<br />return 0;<br />}</p><p>int main()<br />{<br />int n,m;<br />int x;<br />int i;<br />char ch;<br />int arr[50005];<br />int top,base;<br />while(scanf("%d %d",&n,&m) == 2){<br /> buid_tree(1,1,n+1);<br /> top = base = 0;<br /> while(m--){<br /> getchar();<br /> scanf("%c",&ch);<br /> if(ch == 'Q'){<br /> scanf("%d",&x);<br /> printf("%d/n",tree_search(1,x,x+1));<br /> }<br /> if(ch == 'R'){<br /> if(top-base > 0){<br /> tree_insert(1,arr[top-1],arr[top-1]+1,1);<br /> top--;<br /> }<br /> }<br /> if(ch == 'D'){<br /> scanf("%d",&x);<br /> arr[top] = x;<br /> top++;<br /> tree_insert(1,x,x+1,0);<br /> }<br /> }<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.