• [BZOJ3295] [Cqoi2011]动态逆序对


    可用树套树可用CDQ分治(据说还有分块

    基本上算是两种方法的版题。。。详解网上有很多,推荐   http://blog.csdn.net/u011542204/article/details/50571409

    只写了树套树。。CDQ感觉和之前写的版差不多就懒得写了。。

    上代码

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define N 100005
     4 #define X 5000005
     5 #define lowbit(x) ((x)&-(x))
     6 int num[N],pos[N],n,m,t[N],a1[N],a2[N],A[N],B[N],root[X],ls[X],rs[X],sz,sum[X];
     7 long long ans;
     8 int read(int& x){
     9     x=0; int f=1,a=getchar();
    10     while(a<'0' || a>'9') {if(a=='-') f=-1; a=getchar();}
    11     while(a>='0' && a<='9') x=x*10+a-'0',a=getchar(); x*=f;
    12 }
    13 int getans(int x){
    14     int ret=0;
    15     for(int i=x;i;i-=lowbit(i)) ret+=t[i]; return ret; 
    16 }
    17 void update(int& y,int l,int r,int k){
    18     if(!y) y=++sz;  sum[y]++; if(l==r) return;
    19     int mid=(l+r)>>1;
    20     if(k<=mid) update(ls[y],l,mid,k);
    21     else update(rs[y],mid+1,r,k);
    22 } 
    23 int askmore(int x,int y,int k){
    24     int ret=0; A[0]=B[0]=0; x--;
    25     for(int i=x;i;i-=lowbit(i)) A[++A[0]]=root[i];
    26     for(int i=y;i;i-=lowbit(i)) B[++B[0]]=root[i];
    27     int l=1,r=n;
    28     while(l<r){
    29         int mid=(l+r)>>1;
    30         if(k<=mid){
    31             for(int i=1;i<=A[0];i++) ret-=sum[rs[A[i]]],A[i]=ls[A[i]];
    32             for(int i=1;i<=B[0];i++) ret+=sum[rs[B[i]]],B[i]=ls[B[i]];
    33             r=mid;
    34         }
    35         else{
    36             for(int i=1;i<=A[0];i++) A[i]=rs[A[i]];
    37             for(int i=1;i<=B[0];i++) B[i]=rs[B[i]];
    38             l=mid+1;
    39         }
    40     }
    41     return ret;
    42 }
    43 int askless(int x,int y,int k){
    44     int ret=0; A[0]=B[0]=0; x--;
    45     for(int i=x;i;i-=lowbit(i)) A[++A[0]]=root[i];
    46     for(int i=y;i;i-=lowbit(i)) B[++B[0]]=root[i];
    47     int l=1,r=n;
    48     while(l<r){
    49         int mid=(l+r)>>1;
    50         if(k>mid){
    51             for(int i=1;i<=A[0];i++) ret-=sum[ls[A[i]]],A[i]=rs[A[i]];
    52             for(int i=1;i<=B[0];i++) ret+=sum[ls[B[i]]],B[i]=rs[B[i]];
    53             l=mid+1;
    54         }
    55         else{
    56             for(int i=1;i<=A[0];i++) A[i]=ls[A[i]];
    57             for(int i=1;i<=B[0];i++) B[i]=ls[B[i]];
    58             r=mid;
    59         }
    60     }
    61     return ret;
    62 }
    63 int main(){
    64     read(n); read(m);
    65     for(int i=1;i<=n;i++){
    66         read(num[i]); pos[num[i]]=i;
    67         a1[i]=getans(n)-getans(num[i]);                 //以该数为结尾的逆序对 
    68         for(int j=num[i];j<=n;j+=lowbit(j))  t[j]++;
    69         ans+=a1[i];
    70     }
    71     memset(t,0,sizeof(t));
    72     for(int i=n;i>=1;i--){
    73         a2[i]=getans(num[i]-1);
    74         for(int j=num[i];j<=n;j+=lowbit(j)) t[j]++;    //以该数为开头的逆序对 
    75     }
    76     for(int a,i=1;i<=m;i++){
    77         printf("%lld
    ",ans);
    78         read(a); a=pos[a];  
    79         ans-=(a1[a]+a2[a]-askmore(1,a-1,num[a])-askless(a+1,n,num[a]));    //删点转化为加点 
    80         for(int j=a;j<=n;j+=lowbit(j)) update(root[j],1,n,num[a]);
    81     }
    82     return 0;
    83 }
  • 相关阅读:
    第三方登录原理
    django-rest-framework之 json web token方式完成用户认证
    HTTP Basic Authentication认证
    python 创建虚拟环境
    scrapy pipeline
    beautifulsoup 安装
    scrapy 安装
    Jmeter 安装
    css中的行高line-height
    html块级元素与行内元素
  • 原文地址:https://www.cnblogs.com/enigma-aw/p/5980794.html
Copyright © 2020-2023  润新知