Codeforces Beta Round #38 G Queue 動態樹

來源:互聯網
上載者:User

本題算是比較難想的題目了,比賽的時候想成splay果斷悲劇,今晚才突然發現直接用可以合并的樹就可以了。

思路是維護一顆二叉樹,每次來了一個元素,找到元素對應的位置,注意找到的位置是靠最右邊的第一個比它大的元素的位置,如果此元素在c[i]步內不能到達,就插入元素到右邊第c[i]個位置。

動態樹的split函數表示將樹中的第k個和第k-1個元素分開,形成兩棵樹,這樣我們將一個單獨的結點分別與這兩棵樹合并,就可以得到新的序列。

 

最後進行中序遍曆得到最後的解,注意樹的合并必須用隨機演算法,否則會使樹退化。

 

My Code:

#include <cstdio><br />#include <cstring><br />#include <cstdlib><br />#include <algorithm> </p><p>using namespace std; </p><p>const int MAX=1000100;<br />const int oo=0x3f3f3f3f;<br />struct Node{<br /> int l,r;<br /> int val,ma,size; </p><p> Node(){<br /> l=r=0;<br /> val=ma=size=0;<br /> }<br />}node[MAX]; </p><p>int find(int k,int val){<br /> if(k==0){<br /> return 0;<br /> }<br /> if(val<=node[node[k].r].ma){<br /> return node[node[k].l].size+1+find(node[k].r,val);<br /> }else if(val<=node[k].val){<br /> return node[node[k].l].size+1;<br /> }else{<br /> return find(node[k].l,val);<br /> }<br />} </p><p>void update(int k){<br /> node[k].size=node[node[k].l].size+node[node[k].r].size+1;<br /> node[k].ma=max(node[k].val,max(node[node[k].l].ma,node[node[k].r].ma));<br />} </p><p>void split(int k,int id,int& l,int& r){<br /> if(k==0){<br /> l=r=0;<br /> return;<br /> }<br /> if(node[node[k].l].size>=id){<br /> split(node[k].l,id,l,node[k].l);<br /> r=k;<br /> }else if(node[node[k].l].size+1<id){<br /> split(node[k].r,id-node[node[k].l].size-1,node[k].r,r);<br /> l=k;<br /> }else{<br /> l=node[k].l;<br /> r=k;<br /> node[k].l=0;<br /> }<br /> update(k);<br />} </p><p>int join(int x,int y){<br /> if(x==0){<br /> return y;<br /> }else if(y==0){<br /> return x;<br /> }else{<br /> if(rand()%1000<500){<br /> node[x].r=join(node[x].r,y);<br /> update(x);<br /> return x;<br /> }else{<br /> node[y].l=join(x,node[y].l);<br /> update(y);<br /> return y;<br /> }<br /> }<br />} </p><p>bool done;<br />void dfs(int k){<br /> if(node[k].l){<br /> dfs(node[k].l);<br /> }<br /> if(done){<br /> putchar(' ');<br /> }else{<br /> done=true;<br /> }<br /> printf("%d",k);<br /> if(node[k].r){<br /> dfs(node[k].r);<br /> }<br />} </p><p>int main(){<br /> int n,root=0;<br /> int id,x;<br /> int l,r; </p><p> node[0].ma=node[0].val=-oo;<br /> scanf("%d",&n);<br /> for(int i=1;i<=n;i++){<br /> scanf("%d%d",&id,&x);<br /> x=max(i-x,find(root,id)+1);<br /> split(root,x,l,r);<br /> node[i].val=id;<br /> update(i);<br /> l=join(l,i);<br /> root=join(l,r);<br /> }<br /> done=false;<br /> dfs(root);<br /> puts(""); </p><p> 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.