HDU4006(The kth great number)
生活随笔
收集整理的這篇文章主要介紹了
HDU4006(The kth great number)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
兩種方法做:優先隊列和SBT。
先說說SBT吧。。。。
/************************************************* 題目大意: 針對每次查詢,輸出第K大數;算法思想:(1)根據題意可知,只需保留前K個大數,并且按降序排列; 也就是說每加入一個數就找到這個數的位置; 然后將大于K個元素之外的數刪除; 利用優先級隊列就可以很好的做到;(2)SBT或者樹狀數組解決; **************************************************/ #include<iostream> #include<algorithm> #include<cmath> #include<cstdio> using namespace std;const int N=1000010; int l[N],r[N],s[N]; int key[N]; int node;void left_rotate(int &t) {int k=r[t];r[t]=l[k];l[k]=t;s[k]=s[t];s[t]=s[l[t]]+s[r[t]]+1;t=k; }void right_rotate(int &t) {int k=l[t];l[t]=r[k];r[k]=t;s[k]=s[t];s[t]=s[l[t]]+s[r[t]]+1;t=k; }void maintain(int &t,bool flag) {if(flag==false){if(s[l[l[t]]]>s[r[t]])right_rotate(t);else if(s[l[r[t]]]>s[r[t]]){left_rotate(t);right_rotate(t);}elsereturn ;}else{if(s[r[r[t]]]>s[l[t]])left_rotate(t);else if(s[r[l[t]]]>s[l[t]]){right_rotate(t);left_rotate(t);}elsereturn ;}maintain(l[t],false);maintain(r[t],true);maintain(t,false);maintain(t,true); }void insert(int &t,int k) {if(!t){s[t=++node]=1;l[t]=r[t]=0;key[t]=k;}else{++s[t];if(key[t]>k)insert(l[t],k);elseinsert(r[t],k);maintain(t,k>=key[t]);} }int select(int t,int k) {int v=s[l[t]]+1;if(k==v)return key[t];else if(k<v)return select(l[t],k);elsereturn select(r[t],k-v); }int main() {int n,k;while(~scanf("%d%d",&n,&k)){int u=node=s[0]=0;while(n--){char c;int x;scanf(" %c",&c);if(c=='I'){scanf("%d",&x);insert(u,x);}elseprintf("%d\n",select(u,s[u]+1-k));}}return 0; }
然后優先隊列也可以:
?
?
總結
以上是生活随笔為你收集整理的HDU4006(The kth great number)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BST(Binary Search Tr
- 下一篇: Spaly_Tree 模版