日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU4006(The kth great number)

發(fā)布時間:2024/4/11 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU4006(The kth great number) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

兩種方法做:優(yōu)先隊列和SBT。

先說說SBT吧。。。。

/************************************************* 題目大意: 針對每次查詢,輸出第K大數(shù);算法思想:(1)根據(jù)題意可知,只需保留前K個大數(shù),并且按降序排列; 也就是說每加入一個數(shù)就找到這個數(shù)的位置; 然后將大于K個元素之外的數(shù)刪除; 利用優(yōu)先級隊列就可以很好的做到;(2)SBT或者樹狀數(shù)組解決; **************************************************/ #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; }


然后優(yōu)先隊列也可以:

#include<iostream> #include<algorithm> #include<cmath> #include<cstdio> #include<queue> using namespace std;int main() {int n,k;while(~scanf("%d%d",&n,&k)){priority_queue<int,vector<int>,greater<int> > Q;for(int i=1;i<=n;i++){char c;scanf(" %c",&c);if(c=='I'){int x;scanf("%d",&x);Q.push(x);if(Q.size()>k)Q.pop();}elseprintf("%d\n",Q.top());}}return 0; }


?

?

總結

以上是生活随笔為你收集整理的HDU4006(The kth great number)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。