标签: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