zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Intent
    What should we do next in general after collecting relevant data
    NOTE FOR Secure Friend Discovery in Mobile Social Networks
    missing pcap.h
    after building Android Source code
    plot point(one column)
    When talking to someone else, don't infer that is has been talked with others at first. It may bring repulsion to the person who is talking with you.
    进程基本知识
    Python input和raw_input的区别
    强制 code review:reviewboard+svn 的方案
  • 原文地址:https://www.cnblogs.com/shenben/p/6242116.html
Copyright © 2011-2022 走看看