静态区间第K大
2015-12-08 20:39
190 查看
<a target=_blank href="http://poj.org/problem?id=2104" target="_blank"><span style="font-size:24px;">POJ 2104</span></a>
POJ 2761
做法好多,主席树,划分树,离线处理(曼哈顿最小生成树?)+BST(Treap or Splay or SBT),貌似分治+BIT也可以,不过懒得搞了。
以后复习模板时用得上。
主席树:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=100010; struct Node{ int l,r,w; }tr[N*20]; int a ,b ,rank ,root ,sz; void ins(int &i,int l,int r,int x){ tr[++sz]=tr[i];i=sz; tr[i].w++; if(l==r)return; int m=l+r>>1; if(x<=m)ins(tr[i].l,l,m,x); else ins(tr[i].r,m+1,r,x); } int query(int i,int j,int l,int r,int k){ if(l==r)return l; int m=l+r>>1; int tmp=tr[tr[j].l].w-tr[tr[i].l].w; if(k<=tmp)return query(tr[i].l,tr[j].l,l,m,k); else return query(tr[i].r,tr[j].r,m+1,r,k-tmp); } inline bool cmp(int i,int j){ return a[i]<a[j]; } int main(){ int n,m;scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]);rank[i]=i; } sort(rank+1,rank+1+n,cmp); for(int i=1;i<=n;i++)b[rank[i]]=i; for(int i=1;i<=n;i++){ root[i]=root[i-1]; ins(root[i],1,n,b[i]); } int x,y,k; while(m--){ scanf("%d%d%d",&x,&y,&k); int tmp=query(root[x-1],root[y],1,n,k); printf("%d\n",a[rank[tmp]]); } return 0; }
相关文章推荐
- xcode 使用代码块Code Snippets
- 方法选择器的妙用
- MNIST手写数字数据库
- WCF类型共享技巧【转载】
- 【转载】COM 组件设计与应用(十八)——属性包
- 北大OJ3414
- c语言输入输出优化
- 关于博客搬家及github的一些
- 北大OJ1308
- LeetCode 39 && 40 Combination Sum I && II 关键在于剪枝,剪枝讨论在末尾
- Android实现简单的文件下载
- ndk for mac 下载地址
- iOS 9 请求网络数据出现:App Transport Security has blocked a cleartext HTTP (http://) resource load since it
- Daily Scrum 12.8
- oracle迁移mysql数据库注意
- HDOJ1796 How many integers can you find(dfs+容斥)
- POJ 2586 贪心
- DoTween - Sequence
- Unix 环境高级编程(APUE) 之 七 进程关系 和 守护进程
- 找出数组中的第K大的元素