可用树套树可用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 }