1. 程式人生 > >【bzoj3295】動態逆序對

【bzoj3295】動態逆序對

== 數據結構 aps img src zoj none fin 結果

我怎麽控制不住自己又寫了個數據結構啊……真是的……

技術分享

其實我是想練CDQ分治的……結果忍不住又寫了個主席樹。

首先看看不動態的逆序對咋做?樹狀數組嘛。

那麽刪除咋搞?就是考慮貢獻,把它前面比他大的,後面比他小的減去……

誒?帶修改主席樹?我……我好像才寫過……?

技術分享

技術分享
 1 #include<bits/stdc++.h>
 2 #define inf 0x7fffffff
 3 #define N 100005
 4 #define M 5000005
 5 using namespace std;
 6 typedef long long ll;
 7 ll ans;
 8 int n,m,sz,a[100
],b[100],val[N],pos[N],a1[N],a2[N]; 9 int c[N*10],rt[N],ls[M],rs[M],sumv[M]; 10 inline int lowbit(int x){return x&(-x);} 11 inline int ask(int x){ 12 int ans=0; 13 for(int i=x;i;i-=lowbit(i))ans+=c[i]; 14 return ans; 15 } 16 void change(int &o,int l,int r,int q){ 17 if(!o)o=++sz;sumv[o]++;
18 if(l==r)return; 19 int mid=(l+r)>>1; 20 if(q<=mid)change(ls[o],l,mid,q); 21 else change(rs[o],mid+1,r,q); 22 } 23 int querysub(int x,int y,int v){ 24 int cnta=0,cntb=0;int ans=0;x--; 25 for(int i=x;i;i-=lowbit(i))a[++cnta]=rt[i]; 26 for(int i=y;i;i-=lowbit(i))b[++cntb]=rt[i];
27 int l=1,r=n; 28 while(l!=r){ 29 int mid=(l+r)>>1; 30 if(v<=mid){ 31 for(int i=1;i<=cnta;i++)ans-=sumv[rs[a[i]]]; 32 for(int i=1;i<=cntb;i++)ans+=sumv[rs[b[i]]]; 33 for(int i=1;i<=cnta;i++)a[i]=ls[a[i]]; 34 for(int i=1;i<=cntb;i++)b[i]=ls[b[i]]; 35 r=mid; 36 } 37 else{ 38 for(int i=1;i<=cnta;i++)a[i]=rs[a[i]]; 39 for(int i=1;i<=cntb;i++)b[i]=rs[b[i]]; 40 l=mid+1; 41 } 42 } 43 return ans; 44 } 45 int querypre(int x,int y,int v){ 46 int cnta=0,cntb=0,ans=0;x--; 47 for(int i=x;i;i-=lowbit(i))a[++cnta]=rt[i]; 48 for(int i=y;i;i-=lowbit(i))b[++cntb]=rt[i]; 49 int l=1,r=n; 50 while(l!=r){ 51 int mid=(l+r)>>1; 52 if(v>mid){ 53 for(int i=1;i<=cnta;i++)ans-=sumv[ls[a[i]]]; 54 for(int i=1;i<=cntb;i++)ans+=sumv[ls[b[i]]]; 55 for(int i=1;i<=cnta;i++)a[i]=rs[a[i]]; 56 for(int i=1;i<=cntb;i++)b[i]=rs[b[i]]; 57 l=mid+1; 58 } 59 else{ 60 for(int i=1;i<=cnta;i++)a[i]=ls[a[i]]; 61 for(int i=1;i<=cntb;i++)b[i]=ls[b[i]]; 62 r=mid; 63 } 64 } 65 return ans; 66 } 67 inline int read(){ 68 int f=1,x=0;char ch; 69 do{ch=getchar();if(ch==-)f=-1;}while(ch<0||ch>9); 70 do{x=x*10+ch-0;ch=getchar();}while(ch>=0&&ch<=9); 71 return f*x; 72 } 73 int main(){ 74 n=read();m=read(); 75 for(int i=1;i<=n;i++){ 76 val[i]=read();pos[val[i]]=i; 77 a1[i]=ask(n)-ask(val[i]); 78 ans+=a1[i]; 79 for(int j=val[i];j<=n;j+=lowbit(j))c[j]++; 80 } 81 memset(c,0,sizeof(c)); 82 for(int i=n;i;i--){ 83 a2[i]=ask(val[i]-1); 84 for(int j=val[i];j<=n;j+=lowbit(j))c[j]++; 85 } 86 for(int i=1;i<=m;i++){ 87 printf("%lld\n",ans); 88 int x=read();x=pos[x]; 89 ans-=(a1[x]+a2[x]-querysub(1,x-1,val[x])-querypre(x+1,n,val[x])); 90 for(int j=x;j<=n;j+=lowbit(j))change(rt[j],1,n,val[x]); 91 } 92 return 0; 93 }
View Code


感覺在寫數據結構就要數據結構上癮綜合癥了。

業界俗稱 數據結構學傻

順便紀念一下bzoj200AC。

技術分享

【bzoj3295】動態逆序對