可用树套树可用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\n",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 }