• 【bzoj3295】动态逆序对


    我怎么控制不住自己又写了个数据结构啊……真是的……

    其实我是想练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
    ",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。

     

  • 相关阅读:
    Silverlight分享一套企业开发主题
    [Silverlight]常见问题
    Silverlight开发工具汇总
    ExecuteNonQuery返回负数
    Silverlight客户端调用WCF服务难题解疑
    winform调用WCF默认实例
    WCF默认实例的解读
    Silverlight闹钟
    HelloSilverlight
    读取Word文档的标题
  • 原文地址:https://www.cnblogs.com/zcysky/p/6842774.html
Copyright © 2020-2023  润新知