【poj2104】K-th Number 归并树
2015-10-10 08:57
295 查看
说起来这是第二次A这个题了23333
第一次是分块,戳这里
归并树比分块打起来爽,速度还快,简直好评
思想:线段树套数组【雾。线段树每个节点保存它所表示的区间的有序数字排列。实现就是在归并排序的过程中保存归并排序的过程。蛮好打的。
并且调试什么的也没出什么大问题别忘了手动读入,别忘了读负数,归并排序的tmp数组不要menset(会T)(所以我直接没用tmp数组)
代码:
第一次是分块,戳这里
归并树比分块打起来爽,速度还快,简直好评
思想:线段树套数组【雾。线段树每个节点保存它所表示的区间的有序数字排列。实现就是在归并排序的过程中保存归并排序的过程。蛮好打的。
并且调试什么的也没出什么大问题别忘了手动读入,别忘了读负数,归并排序的tmp数组不要menset(会T)(所以我直接没用tmp数组)
代码:
[code]#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int size=200010; struct segment{ int l,r; vector<int> num; }tree[size*4]; int num[size]; void merge(int p) { int pl=0,pr=0,pp=0; int lz=tree[p<<1].num.size(),rz=tree[p<<1|1].num.size(); while(pl<lz||pr<rz) { if(pr>=rz|| ( pl<lz&&tree[p<<1].num[pl]<=tree[p<<1|1].num[pr] ) ) tree[p].num.push_back(tree[p<<1].num[pl++]); else tree[p].num.push_back(tree[p<<1|1].num[pr++]); } } void build(int p,int l,int r) { tree[p].l=l; tree[p].r=r; if(l==r) { tree[p].num.push_back(num[l]); return ; } int mid=(l+r)>>1; build(p<<1,l,mid); build(p<<1|1,mid+1,r); merge(p); } int n,m; int ask(int p,int l,int r,int d) { if(l<=tree[p].l&&tree[p].r<=r) { return lower_bound(tree[p].num.begin(),tree[p].num.end(),d)-tree[p].num.begin(); } int mid=(tree[p].l+tree[p].r)>>1; int ans=0; if(l<=mid) ans+=ask(p<<1,l,r,d); if(mid<r) ans+=ask(p<<1|1,l,r,d); return ans; } int div(int l,int r,int k) { int ll=0,rr=n+1; while(rr-ll>1) { int mid=(ll+rr)>>1,tmp; if(( tmp=ask(1,l,r,num[mid]) )>=k) rr=mid; else ll=mid; // cout<<num[mid]<<" "<<tmp<<endl; } return num[ll]; } void scan(int &n) { n=0; int flag=1; char a=getchar(); while(a>'9'||a<'0') {if(a=='-') flag=-1;a=getchar();} while(a<='9'&&a>='0') n=n*10+a-'0',a=getchar(); n*=flag; } int main() { // freopen("in.txt","r",stdin);freopen("out.txt","w",stdout); scan(n),scan(m); for(int i=1;i<=n;i++) { scan(num[i]); } build(1,1,n); sort(num+1,num+1+n); while(m--) { int l,r,k; scan(l),scan(r),scan(k); printf("%d\n",div(l,r,k)); } return 0; }
相关文章推荐
- iOS中英文混排,获取字符串长度(中文字符数)
- 成功的 Apps 所具有的共同点
- MeteoInfoLab脚本示例:计算水平螺旋度
- Transaction(事务)浅谈
- 关于math.round()
- 使用AFNetworking下载文件
- Linux共享内存,打印系统IPC信息
- JS数组定义
- 获取Spring管理的Bean方法
- 入库只能入库56张,就卡住了
- wex5是什么?号称可以跨平台开发的免费开源框架
- 基于粒子滤波的物体跟踪
- 21分钟 MySQL 入门教程
- iOS - UIButton(UIEdgeInsets)/设置button上的文字和图片 在定义位置
- Nhibernate
- NSData与NSMutableData
- MySQL核心基础(一)之数据库介绍
- [TwistedFate]bool类型,关系运算符,逻辑运算符,程序的三种结构,条件表达式,枚举类型,if,switch语句
- 今天要做的事
- Unknown tag (s:property).