3295: [Cqoi2011]动态逆序对

**Time Limit: 10 Sec Memory Limit: 128 MB

Description

对于序列A,它的逆序对数定义为满足i&lt;j" role="presentation" style="position: relative;">i<ji<j,且Ai>Aj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删

除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数

Input

输入第一行包含两个整数n和m,即初始元素的个数和删除的元素个数。

以下n行每行包含一个1到n之间的正整数,即初始排列。

以下m行每行一个正整数,依次为每次删除的元素。

N<=100000 M<=50000

Output

输出包含m行,依次为删除每个元素之前,逆序对的个数。

Sample Input

5 4

1

5

3

4

2

5

1

4

2

Sample Output

5

2

2

1

样例解释

(1,5,3,4,2)(1,3,4,2)(3,4,2)(3,2)(3)" role="presentation" style="position: relative;">(1,5,3,4,2)(1,3,4,2)(3,4,2)(3,2)(3)(1,5,3,4,2)(1,3,4,2)(3,4,2)(3,2)(3)。

这道题显然是一道带修改主席树(或者cdq分治),主要讲讲如何用带修改主席树来解决这个问题。

首先各位大佬要先保证自己会用树状数组求逆序对,这样我们可以求出最开始的答案值(当然你用线段树,cdq分治,归并排序写也可以,只是码量相对较大)。想用知道cdq分治求逆序对的原理的请戳这里

那么我们思考一下,如果我们知道上一次的答案,我们只需要计算出这一次修改的差量即可,怎么计算差量呢?我们知道,如果第i" role="presentation" style="position: relative;">ii个数被删除了,那么逆序对总数会减少在i" role="presentation" style="position: relative;">ii之前没被删除的且比ai" role="presentation" style="position: relative;">aiai大的数的总数加上在i" role="presentation" style="position: relative;">ii之后没被删除的且比ai" role="presentation" style="position: relative;">aiai小的数的总数。不难看出这两个量是一种对称的关系,这样的话我们只用思考其中一种情况。

So" role="presentation" style="position: relative;">SoSo,如何维护在i" role="presentation" style="position: relative;">ii之前没被删除的且比ai" role="presentation" style="position: relative;">aiai大的数的总数呢?做了那么多题,我们应当想到正难则反。我们可以先统计出原数列中在i" role="presentation" style="position: relative;">ii之前且比ai" role="presentation" style="position: relative;">aiai大的数,在统计出被删除的数中在i" role="presentation" style="position: relative;">ii之前且比ai" role="presentation" style="position: relative;">aiai大的数,前者可以在统计逆序对时顺便求出,后者直接用带修改主席树求一求就行了。

至此,我们已经解决了这个问题。最后吐槽一句:BZOJ时空限制真的有点烦人。

代码如下:

#include<bits/stdc++.h>
#define N 100005
using namespace std;
inline int read(){
    int ans=0,w;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
    return ans;
}
long long ans=0,bit1[N],ans1[N],ans2[N];
int a[N],n,m,mp[N],rt[N*50],siz=0;
struct Node{int l,r,sum;}T[N*50];
inline int lowbit(int x){return x&-x;}
inline void add1(int x,int v){for(int i=x;i<=n;i+=lowbit(i))bit1[i]+=v;}
inline long long query1(int x){long long ret=0;for(int i=x;i;i-=lowbit(i))ret+=bit1[i];return ret;}
inline void add(int &p,int l,int r,int v){
    if(!p)p=++siz;
    ++T[p].sum;
    if(l==r)return;
    int mid=l+r>>1;
    if(v<=mid)add(T[p].l,l,mid,v);
    else add(T[p].r,mid+1,r,v);
}
inline long long query(int p,int l,int r,int ql,int qr){
    if(qr<l||ql>r)return 0;
    if(ql<=l&&r<=qr)return T[p].sum;
    int mid=l+r>>1;
    return query(T[p].l,l,mid,ql,qr)+query(T[p].r,mid+1,r,ql,qr);

}
inline long long ask(int l,int r,int ql,int qr){
    if(ql>qr)return 0;
    long long ret=0;
    for(;l;l-=lowbit(l))ret-=query(rt[l],1,n,ql,qr);
    for(;r;r-=lowbit(r))ret+=query(rt[r],1,n,ql,qr);
    return ret;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i){
        scanf("%d",&a[i]);
        mp[a[i]]=i;
        ans1[i]=query1(n)-query1(a[i]);
        ans+=ans1[i];
        add1(a[i],1);
    }
    for(int i=1;i<=n;++i)bit1[i]=0;
    for(int i=n;i>=1;--i){
        ans2[i]=query1(a[i]-1);
        add1(a[i],1);
    }
    for(int i=1;i<=m;++i){
        printf("%lld\n",ans);
        int now,pos;
        scanf("%lld",&now);
        pos=mp[now];
        ans-=(ans1[pos]+ans2[pos])-ask(0,pos,now+1,n)-ask(pos,n,1,now-1);
        for(int j=pos;j<=n;j+=lowbit(j))
            add(rt[j],1,n,now);
    }
    return 0;
}

2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)的更多相关文章

  1. [luogu3157][bzoj3295][CQOI2011]动态逆序对【cdq分治+树状数组】

    题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序 ...

  2. bzoj3295 [Cqoi2011]动态逆序对 cdq+树状数组

    [bzoj3295][Cqoi2011]动态逆序对 2014年6月17日4,7954 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. ...

  3. bzoj3295[Cqoi2011]动态逆序对 树套树

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5987  Solved: 2080[Submit][Sta ...

  4. [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...

  5. bzoj千题计划146:bzoj3295: [Cqoi2011]动态逆序对

    http://www.lydsy.com/JudgeOnline/problem.php?id=3295 正着删除看做倒着添加 对答案有贡献的数对满足以下3个条件: 出现时间:i<=j 权值大小 ...

  6. BZOJ3295: [Cqoi2011]动态逆序对(树状数组套主席树)

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 7465  Solved: 2662[Submit][Sta ...

  7. BZOJ3295 [Cqoi2011]动态逆序对 —— CDQ分治

    题目链接:https://vjudge.net/problem/HYSBZ-3295 3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 1 ...

  8. bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)

    3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...

  9. [bzoj3295][Cqoi2011]动态逆序对_主席树

    动态逆序对 bzoj-3295 Cqoi-2011 题目大意:题目链接. 注释:略. 想法:直接建立主席树. 由于是一个一个删除,所以我们先拿建立好的root[n]的权值线段树先把总逆序对求出来,接着 ...

随机推荐

  1. Delphi Berlin 窗体代码分离风格 回到Delphi7传统风格

    回到Delphi7传统风格 Floating Form Designer You can now detach the form designer in both, VCL and FireMonke ...

  2. Yii常用变量

    调用YII框架中 jquery:Yii::app()->clientScript->registerCoreScript('jquery'); 调用YII框架中 jquery:Yii::a ...

  3. Js 正则限制只能输入数字或中文的代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 迭代器iter()

    from collections import Iterable print(isinstance({},iterable)) # 判断是否可迭代 from collections import It ...

  5. 4 并发编程-(进程)-守护进程&互斥锁

    一.守护进程 主进程创建子进程,然后将该进程设置成守护自己的进程,守护进程就好比崇祯皇帝身边的老太监,崇祯皇帝已死老太监就跟着殉葬了. 关于守护进程需要强调两点: 其一:守护进程会在主进程代码执行结束 ...

  6. UI5-文档-4.12-Shell Control as Container

    现在我们使用shell控件作为应用程序的容器,并使用它作为新的根元素.shell通过在桌面屏幕上引入一个所谓的信箱,来负责应用程序对设备屏幕大小的视觉调整. Preview The app is no ...

  7. Apache相关安全设置

    刚刚安装完Apache2.2和php 5.2.14后,配置完成首次用httpd启动时出现Apache 2 Test Page,并有如下提示:     此问题的解决办法是: 1. 找到一个叫做welco ...

  8. 3.3 JSP内置对象概述

    1.request 1.1 request获取页面传来的参数,参数通过浏览器网址和后面添加?的方式传达. 传参:”show.jsp?id=001” 获取参数:request.getParameter( ...

  9. System.Data.SqlClient.SqlError: 尚未备份数据库的日志尾部

    SQL还原时出现下面的错误,System.Data.SqlClient.SqlError: 尚未备份数据库 "***" 的日志尾部.如果该日志包含您不希望丢失的工作,请使用 BAC ...

  10. Python递归的经典案例

    目录 : 一.递归的简介 二.递归的经典应用   2.1 递归求阶乘   2.2 递归推斐波那契数列   2.3 二分法找有序列表指定值   2.4 递归解汉诺塔 前言: 当我们碰到诸如需要求阶乘或斐 ...