• AC日记——Dynamic Ranking 洛谷 P2617


    Dynamic Ranking

    思路;

      可持久化树状数组;

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    #define maxn 10005
    #define maxtot maxn*600
    struct QueryType {
        int l,r,k;
        char op[4];
    };
    struct QueryType qu[maxn];
    int n,m,ai[maxn],bi[maxn<<1],root[maxn];
    int posl[100],numl,posr[100],numr,lc[maxtot];
    int rc[maxtot],dis[maxtot],tot,cnt,size;
    inline void in(int &now)
    {
        char Cget=getchar();now=0;
        while(Cget>'9'||Cget<'0') Cget=getchar();
        while(Cget>='0'&&Cget<='9')
        {
            now=now*10+Cget-'0';
            Cget=getchar();
        }
    }
    inline int lowbit(int x)
    {
        return x&(-x);
    }
    inline void add(int &now,int l,int r,int to,int x)
    {
        if(!now) now=++tot;dis[now]+=x;
        if(l==r) return;int mid=l+r>>1;
        if(to<=mid) add(lc[now],l,mid,to,x);
        else add(rc[now],mid+1,r,to,x);
    }
    inline void tree_add(int x,int to,int di)
    {
        while(x<=n)
        {
            add(root[x],1,size,to,di);
            x+=lowbit(x);
        }
    }
    inline void pre(int l,int r)
    {
        l--,numl=0,numr=0;
        while(r) posr[++numr]=root[r],r-=lowbit(r);
        while(l) posl[++numl]=root[l],l-=lowbit(l);
    }
    inline int query(int l,int r,int k)
    {
        if(l==r) return bi[l];
        int di=0,mid=l+r>>1;
        for(int i=1;i<=numr;i++) di+=dis[lc[posr[i]]];
        for(int i=1;i<=numl;i++) di-=dis[lc[posl[i]]];
        if(k<=di)
        {
            for(int i=1;i<=numr;i++) posr[i]=lc[posr[i]];
            for(int i=1;i<=numl;i++) posl[i]=lc[posl[i]];
            return query(l,mid,k);
        }
        else
        {
            for(int i=1;i<=numr;i++) posr[i]=rc[posr[i]];
            for(int i=1;i<=numl;i++) posl[i]=rc[posl[i]];
            return query(mid+1,r,k-di);
        }
    }
    int main()
    {
        in(n),in(m);
        for(int i=1;i<=n;i++) in(ai[i]),bi[++cnt]=ai[i];
        for(int i=1;i<=m;i++)
        {
            scanf("%s",qu[i].op),in(qu[i].l),in(qu[i].r);
            if(qu[i].op[0]=='Q') in(qu[i].k);
            else bi[++cnt]=qu[i].r;
        }
        sort(bi+1,bi+cnt+1),size=unique(bi+1,bi+cnt+1)-bi-1;
        for(int i=1;i<=n;i++)
        {
            ai[i]=lower_bound(bi+1,bi+size+1,ai[i])-bi;
            tree_add(i,ai[i],1);
        }
        for(int i=1;i<=m;i++)
        {
            if(qu[i].op[0]=='Q')
            {
                pre(qu[i].l,qu[i].r);
                printf("%d
    ",query(1,size,qu[i].k));
            }
            else
            {
                qu[i].r=lower_bound(bi+1,bi+size+1,qu[i].r)-bi;
                tree_add(qu[i].l,ai[qu[i].l],-1);
                ai[qu[i].l]=qu[i].r;
                tree_add(qu[i].l,qu[i].r,1);
            }
        }
        return 0;
    }
  • 相关阅读:
    jQuery性能优化
    Google Chrome 浏览器 错误 312 (net::ERR_UNSAFE_PORT):未知错误。
    C#简单数字验证码解析
    折半查找
    平均分配算法之倒序贪婪
    字符串相似度算法(编辑距离算法 Levenshtein Distance)
    c# 冒泡排序算法中三种前后值交换算法效率测试
    二叉树的遍历
    C#使用Tesseract OCR 解析验证码
    页面瘦身之压缩viewState和保存viewState到服务器
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6953201.html
Copyright © 2020-2023  润新知