[统计] poj 2761 Feed the dogs
来源:互联网 发布:人工智能行业投资机会 编辑:程序博客网 时间:2024/06/08 07:41
/**[统计] poj 2761 Feed the dogs题意: n个数,m个查询,每次查询[l,r]区间里第k小的数。(需要离散化)题目保证了区间不会相互包含,可以按L排个序。然后对于每个区间加入新节点,删去旧结点,就成了裸的查第k小。这里用 树状数组+二分 实现,O(NlogNlogN)*/#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define N 100001#define lowbit(i) (i&-i)struct lisan{ int val,id; lisan(int a = 0,int c = 0) { val = a; id = c; }}lisa[N];struct node{ int x[2],k,id; void input(int i) { id = i; scanf("%d%d%d",x,x+1,&k); }}qua[N];int val[N],cnt[N];int n,m;int ans[N];bool cmp(node a,node b){ return a.x[0] < b.x[0];}bool cmp2(lisan a,lisan b){ return a.val < b.val;}void add(int i,int c){ for(;i < N; i += lowbit(i)) cnt[i] += c;}int sum(int i){ int ans = 0; for(; i > 0; i -= lowbit(i)) ans += cnt[i]; return ans;}int mp[N];int main(){ int i,j,mx; scanf("%d%d",&n,&m); for(i = 1; i <= n; ++i) { scanf("%d", val + i); lisa[i] = lisan(val[i],i); } sort(lisa + 1,lisa + 1 + n,cmp2); mx = 1; mp[mx] = lisa[1].val; val[lisa[1].id] = mx; for(i = 2; i <= n; ++i) { if(lisa[i].val != lisa[i-1].val) ++mx,mp[mx] = lisa[i].val; val[lisa[i].id] = mx; } for(i = 1; i <= m; ++i) qua[i].input(i); sort(qua + 1,qua + m + 1,cmp); int ll = qua[1].x[0],rr = ll - 1; int l,r,mid; for(i = 1; i <= m; ++i) { for(j = ll; j < qua[i].x[0]; ++j) add(val[j],-1); for(j = rr + 1; j <= qua[i].x[1]; ++j) add(val[j],1); ll = qua[i].x[0]; rr = qua[i].x[1]; l = 1; r = mx; while(l < r) { mid = (l + r) >> 1; if(sum(mid)< qua[i].k) l = mid + 1; else r = mid; } ans[qua[i].id] = mp[r]; } for(i = 1; i <= m; ++i) printf("%d\n",ans[i]); getchar(); return 0;}/**9 31 3 10 2 4 7 7 8 25 9 23 8 41 3 3*/