标签:dea sam ini int bsp printf return complete lov
Time Limit: 6000MS | Memory Limit: 65536K | |
Total Submissions: 20634 | Accepted: 6494 |
Description
Input
Output
Sample Input
7 2 1 5 2 6 3 7 4 1 5 3 2 7 1
Sample Output
3 2
【分析】这题跟POJ2104很像,所以可以用划分树来做。这里只是为了练习主席树就用了主席树的板子,不过主席树还不是很懂。。。
#include <iostream> #include <cstring> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <time.h> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #define met(a,b) memset(a,b,sizeof a) #define pb push_back #define lson(x) ((x<<1)) #define rson(x) ((x<<1)+1) using namespace std; typedef long long ll; const int N=1e5+50; const int M=N*N+10; struct seg { int lson,rson; int cnt; }; seg T[N*20]; int root[N],tot; vector<int>pos; int arr[N]; int last_pos[N]; void init() { pos.clear(); met(root,0);met(last_pos,0); tot=0; T[0].cnt=T[0].lson=T[0].rson=0; } void update(int &cur,int ori,int l,int r,int pos,int flag) { cur=++tot; T[cur]=T[ori]; T[cur].cnt+=flag; if(l==r) return ; int mid=(l+r)/2; if(pos<=mid) update(T[cur].lson,T[ori].lson,l,mid,pos,flag); else update(T[cur].rson,T[ori].rson,mid+1,r,pos,flag); } int query(int S,int E,int l,int r,int k) { if(l==r)return l; int mid=(l+r)/2; int sum=T[T[E].lson].cnt-T[T[S].lson].cnt; if(sum>=k)return query(T[S].lson,T[E].lson,l,mid,k); else query(T[S].rson,T[E].rson,mid+1,r,k-sum); } int main(void) { int n,m,i,l,r,k; scanf("%d%d",&n,&m); init(); for (i=1; i<=n; ++i) { scanf("%d",&arr[i]); pos.push_back(arr[i]); } sort(pos.begin(),pos.end()); pos.erase(unique(pos.begin(),pos.end()),pos.end()); int temp_rt=0; for (i=1; i<=n; ++i) { arr[i]=lower_bound(pos.begin(),pos.end(),arr[i])-pos.begin()+1; update(root[i],root[i-1],1,n,arr[i],1); } for (i=0; i<m; ++i) { scanf("%d%d%d",&l,&r,&k); printf("%d\n",pos[query(root[l-1],root[r],1,n,k)-1]); } return 0; }
POJ 2761 Feed the dogs (主席树)(K-th 值)
标签:dea sam ini int bsp printf return complete lov
原文地址:http://www.cnblogs.com/jianrenfang/p/6373570.html