标签:plm turn padding get inpu therefore pre names lines
| Time Limit: 20000MS | Memory Limit: 65536K | |
| Total Submissions: 52878 | Accepted: 18188 | |
| Case Time Limit: 2000MS | ||
Description
Input
Output
Sample Input
7 3 1 5 2 6 3 7 4 2 5 3 4 4 1 1 7 3
Sample Output
5 6 3
Hint
Source
给出n个数,询问区间第k大...
这题解法有很多...
之前写了整体二分...然后还可以用静态主席树水过...
感觉时间空间复杂度还是差很多的...
| Run ID | User | Problem | Result | Memory | Time | Language | Code Length | Submit Time |
| 16573738 | NEIGHTHORN | 2104 | Accepted | 22644K | 1735MS | G++ | 1196B | 2017-02-12 11:25:34 |
| 16456326 | NEIGHTHORN | 2104 | Accepted | 7672K | 2829MS | G++ | 1492B | 2017-01-07 11:10:22 |
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
using namespace std;
const int maxn=100000+5,maxm=10000000+5;
int n,m,len,tot,a[maxn],mp[maxn],ls[maxm],rs[maxm],sum[maxm],root[maxn];
inline int find(int x){
int l=1,r=len,ans;
while(l<=r){
int mid=(l+r)>>1;
if(mp[mid]>=x)
ans=mid,r=mid-1;
else
l=mid+1;
}
return ans;
}
inline void change(int l,int r,int x,int &y,int val){
y=++tot,sum[y]=sum[x]+1;
if(l==r)
return;
int mid=(l+r)>>1;ls[y]=ls[x],rs[y]=rs[x];
if(val<=mid)
change(l,mid,ls[x],ls[y],val);
else
change(mid+1,r,rs[x],rs[y],val);
}
inline int query(int l,int r,int x,int y,int num){
if(l==r)
return l;
int mid=(l+r)>>1;
if(sum[ls[y]]-sum[ls[x]]>=num)
return query(l,mid,ls[x],ls[y],num);
else
return query(mid+1,r,rs[x],rs[y],num-(sum[ls[y]]-sum[ls[x]]));
}
signed main(void){
scanf("%d%d",&n,&m);
for(int i=1,x;i<=n;i++)
scanf("%d",&a[i]),mp[i]=a[i];
sort(mp+1,mp+n+1);
len=unique(mp+1,mp+n+1)-mp-1;
for(int i=1;i<=n;i++)
change(1,n,root[i-1],root[i],find(a[i]));
for(int i=1,s,x,y;i<=m;i++)
scanf("%d%d%d",&x,&y,&s),printf("%d\n",mp[query(1,len,root[x-1],root[y],s)]);
return 0;
}
//1234
By NeighThorn
标签:plm turn padding get inpu therefore pre names lines
原文地址:http://www.cnblogs.com/neighthorn/p/6390649.html