• BZOJ 3295: [Cqoi2011]动态逆序对


    3295: [Cqoi2011]动态逆序对

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 3865  Solved: 1298
    [Submit][Status][Discuss]

    Description

    对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。

    Input

    输入第一行包含两个整数nm,即初始元素的个数和删除的元素个数。以下n行每行包含一个1到n之间的正整数,即初始排列。以下m行每行一个正整数,依次为每次删除的元素。
     

    Output

     
    输出包含m行,依次为删除每个元素之前,逆序对的个数。

    Sample Input

    5 4
    1
    5
    3
    4
    2
    5
    1
    4
    2

    Sample Output

    5
    2
    2
    1

    样例解释
    (1,5,3,4,2)(1,3,4,2)(3,4,2)(3,2)(3)。

    HINT

    N<=100000 M<=50000

    Source

    树状数组套线段树

    删除某个数,只要统计它之前还存在的比它大的数的个数,和之后还存在的比它小的数的个数

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    #define R register
    using namespace std;
    int read(){
        R int x=0;bool f=1;
        R char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    const int N=1e5+10;
    const int M=N*50;
    int A[30],B[30];
    int n,m,sz,num[N],pos[N],a1[N],a2[N],root[N],c[N];
    int ls[M],rs[M],sum[M];
    ll ans;
    inline int lowbit(int x){
        return x&-x;
    }
    void updata(int p,int v){
        for(int i=p;i<=n;i+=lowbit(i)) c[i]+=v;
    }
    int query(int p){
        int res=0;
        for(int i=p;i;i-=lowbit(i)) res+=c[i];
        return res;
    }
    void update(int &y,int l,int r,int x){
        if(!y) y=++sz;
        sum[y]++;
        if(l==r)return;
        int mid=(l+r)>>1;
        if(x<=mid) update(ls[y],l,mid,x);
        else update(rs[y],mid+1,r,x);
    }
    int askmore(int x,int y,int num){
        A[0]=B[0]=0;int tmp=0;x--;
        for(int i=x;i;i-=lowbit(i)) A[++A[0]]=root[i];
        for(int i=y;i;i-=lowbit(i)) B[++B[0]]=root[i];
        int l=1,r=n;
        while(l!=r){
            int mid=l+r>>1;
            if(num<=mid){
                for(int i=1;i<=A[0];i++) tmp-=sum[rs[A[i]]];
                for(int i=1;i<=B[0];i++) tmp+=sum[rs[B[i]]];
                for(int i=1;i<=A[0];i++) A[i]=ls[A[i]];
                for(int i=1;i<=B[0];i++) B[i]=ls[B[i]];
                r=mid;
            }
            else{
                for(int i=1;i<=A[0];i++) A[i]=rs[A[i]];
                for(int i=1;i<=B[0];i++) B[i]=rs[B[i]];
                l=mid+1;
            }
        }
        return tmp;
    }
    int askless(int x,int y,int num){
        A[0]=B[0]=0;int tmp=0;x--;
        for(int i=x;i;i-=lowbit(i)) A[++A[0]]=root[i];
        for(int i=y;i;i-=lowbit(i)) B[++B[0]]=root[i];
        int l=1,r=n;
        while(l!=r){
            int mid=l+r>>1;
            if(num>mid){
                for(int i=1;i<=A[0];i++) tmp-=sum[ls[A[i]]];
                for(int i=1;i<=B[0];i++) tmp+=sum[ls[B[i]]];
                for(int i=1;i<=A[0];i++) A[i]=rs[A[i]];
                for(int i=1;i<=B[0];i++) B[i]=rs[B[i]];
                l=mid+1;
            }
            else{
                for(int i=1;i<=A[0];i++) A[i]=ls[A[i]];
                for(int i=1;i<=B[0];i++) B[i]=ls[B[i]];
                r=mid;
            }
        }
        return tmp;
    }
    int main(){
        n=read();m=read();
        for(int i=1;i<=n;i++){
            num[i]=read();pos[num[i]]=i;
            a1[i]=query(n)-query(num[i]);
            ans+=a1[i];
            updata(num[i],1);
        }
        memset(c,0,sizeof c);
        for(int i=n;i;i--){
            a2[i]=query(num[i]-1);
            updata(num[i],1);
        }
        for(int i=1,x;i<=m;i++){
            printf("%lld
    ",ans);
            x=read();x=pos[x];
            ans-=(a1[x]+a2[x]-askmore(1,x-1,num[x])-askless(x+1,n,num[x]));
            for(int j=x;j<=n;j+=lowbit(j)) update(root[j],1,n,num[x]);
        }
        return 0;
    }
  • 相关阅读:
    选中实现jquery实现复选框checkbox全选(完善)
    对话框control在对话框picture control中利用opengl进行绘图
    nullnull数字对象的常用处理方法NSNumber
    androidclassListView的Item含有CheckBox时的处理
    绘图对话框基于MFC对话框的OpenGL三维图形开发
    组织学习【学习笔记】《卓有成效的管理者》 第三章 我能贡献什么
    集合元素并查集
    开源请求程序员的黄金时代
    客户端生成nginx webdav配置
    情况虚拟化实战虚拟化存储设计之三MultiPathing
  • 原文地址:https://www.cnblogs.com/shenben/p/6242116.html
Copyright © 2020-2023  润新知