HDU4006(The kth great number)优先级队列/SBT
来源:互联网 发布:沈阳市网络金融 编辑:程序博客网 时间:2024/05/16 15:02
/*************************************************题目大意:针对每次查询,输出第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); } else return ; } 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); } else return ; } 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); else insert(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); else return select(r[t],k-v);}int main(){ //freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin); 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); } else printf("%d\n",select(u,s[u]+1-k)); } } return 0;}
优先级队列:
#include<iostream>#include<algorithm>#include<cmath>#include<cstdio>#include<queue>using namespace std;/*struct node{int tmp;friend bool operator<(const node a,const node b){return a.tmp>b.tmp;}};*/int main(){//freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin);int n,k;while(~scanf("%d%d",&n,&k)){//priority_queue<node>Q;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)优先级队列/SBT
- HDU4006-The kth great number(优先队列)
- [优先队列] HDU4006 The kth great number
- HDU4006 The kth great number 优先队列
- hdu4006 The kth great number 优先队列
- HDU4006 The kth great number(优先队列)
- HDU4006 The kth great number
- HDU4006--The kth great number
- HDU4006(The kth great number)
- 【HDU4006】The kth great number
- hdu4006: The kth great number
- HDU4006 The kth great number
- hdu4006 The kth great number
- hdu4006 The kth great number(优先队列)
- hdu4006 The kth great number(优先队列)
- hdu4006 The kth great number(优先队列)
- [堆] HDU4006 The kth great number
- hdoj 4006The kth great number(优先级队列)
- Linux Mysql 客户端
- JQUERY取节点值
- UVa 280 Vertex ( dfs搜索 水题 )
- iOS开发之Xcode篇
- 二分法类型总结
- HDU4006(The kth great number)优先级队列/SBT
- Android内存泄漏简介
- 关于类型转换的一件小事
- 第一次上机实验报告
- stl中map用法详解
- JAVA语言学习_02(关于static)
- Servlet详解
- 二、Mongodb实战之——Mongodb Shell实现简单插入和查询
- FreeType2中文手册