[统计] 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*/


原创粉丝点击