http://www.lydsy.com/JudgeOnline/problem.php?id=3295 (题目链接)

题意

  给出某种排列,按照某种顺序依次删除m个数,在每次删除一个数前统计序列中逆序对对个数。

Solution

  作为一个CDQ分治的初学者,我毫不犹豫的%了LCF的题解。

  这里介绍下三维偏序的求法:一维排序,二维归并,三维树状数组。

  排序维护x维之后,递归处理:

    1.在处理区间[L,R]的时候,先二分区间[L, (L+R)/ 2],递归求这个左区间(二分的原因是我在维护y维的时候难免破坏x维的性质,但是二分之后我还是可以保证左区间的x全都大于右区间的x)。

    2.这个时候左区间y维已经有序,我们只好把右区间[(L+R)/2,R],快排一遍,进行归并式的dp转移(左区间一个指针,右区间一个指针,保证左区间指针所扫过的y一定小于右区间指针所扫过的y),然后在用常规的树状数组维护z。

    3.当然,最后还应该把右区间[(L+R)/2,R]按x快排回去,并递归处理这一段。

    4.最后归并或者快排维护整个区间的y有序。

  像这种题目,经常把时间作为第三维做三维偏序。

细节

  ?

代码

// bzoj3295
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1ll<<60)
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int maxn=100010;
int c[maxn],f[maxn],pos[maxn],n,m;
struct data {int x,y,z;}a[maxn],t[maxn]; bool cmp(data a,data b) {
return a.z<b.z;
}
int lowbit(int x) {
return x&-x;
}
void add(int x,int val) {
for (int i=x;i<=n;i+=lowbit(i)) c[i]+=val;
}
LL query(int x) {
int res=0;
for (int i=x;i;i-=lowbit(i)) res+=c[i];
return res;
}
void solve(int l,int r) {
if (l==r) return;
int mid=(l+r)>>1;
solve(l,mid);solve(mid+1,r);
for (int i=l,j=mid+1,k=l;i<=mid || j<=r;) {
if ((j<=r && a[j].x<a[i].x) || i>mid) add(a[j].y,1),t[k++]=a[j++];
else f[a[i].z]+=query(n)-query(a[i].y),t[k++]=a[i++];
}
for (int i=mid+1;i<=r;i++) add(a[i].y,-1);
for (int i=mid,j=r;i>=l || j>=mid+1;) {
if ((j>=mid+1 && a[j].x>a[i].x) || i<l) add(a[j].y,1),j--;
else f[a[i].z]+=query(a[i].y-1),i--;
}
for (int i=mid+1;i<=r;i++) add(a[i].y,-1);
for (int i=l;i<=r;i++) a[i]=t[i];
}
int main() {
scanf("%d%d",&n,&m);
for (int x,i=1;i<=n;i++) scanf("%d",&x),pos[x]=i;
for (int x,i=1;i<=m;i++) scanf("%d",&x),a[pos[x]]=(data){x,pos[x],i};
for (int x=m,i=1;i<=n;i++) if (!a[pos[i]].z) a[pos[i]]=(data){i,pos[i],++x};
sort(a+1,a+1+n,cmp);
solve(1,n);
LL ans=0;
for (int i=1;i<=n;i++) ans+=f[i];
for (int i=1;i<=m;i++) printf("%lld\n",ans),ans-=f[i];
return 0;
}

【bzoj3295】 Cqoi2011—动态逆序对的更多相关文章

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

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

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

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

  3. 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)

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

  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]的权值线段树先把总逆序对求出来,接着 ...

  10. bzoj3295: [Cqoi2011]动态逆序对(树套树)

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

随机推荐

  1. java多线程系类:基础篇:03Thread中的start()和run()的区别

    这个系类的内容全部来源于http://www.cnblogs.com/skywang12345/p/3479024.html.特别在此声明!!! 概要 Thread类包含start()和run()方法 ...

  2. 在windows下安装配置Ulipad

    在windows下安装配置Ulipad 今天推荐一款轻便的文本编辑器Ulipad,用来写一些小的Python脚本非常方便. Ulipad下载地址: https://github.com/limodou ...

  3. visual studio 2012 的制作ActiveX、打包和发布

    开发环境是Vs 2012  Framework 4.0 源码和制作工具在文章最下边 一. ActiveX控件Demo 新建一个Window窗体控件库项目 在自动生成的UserControl1页面上添加 ...

  4. 如何在 apache 中开启 gzip 压缩服务

    服务器设置 gzip 压缩是 web 开发里很普遍的做法.假设你要请求一个 100k 的文件,网络传输速度为 50k/s,需要 2s 才能得到数据,但是如果在服务器设置了 gzip 压缩,将服务端的文 ...

  5. 使用HttpWebRequest和HtmlAgilityPack抓取网页(拒绝乱码,拒绝正则表达式)

    废话不多说, 直接说需求. 公司的网站需要抓取其他网站的文章,但任务没到我这,同事搞了一下午没搞出来.由于刚刚到公司, 想证明下自己,就把活揽过来了.因为以前做过,觉得应该很简单,但当我开始做的时候, ...

  6. 【深入ASP.NET原理系列】--ASP.NET请求管道、应用程序生命周期、整体运行机制

    微软的程序设计和相应的IDE做的很棒,让人很快就能有生产力..NET上手容易,生产力很高,但对于一个不是那么勤奋的人,他很可能就不再进步了,没有想深入下去的动力,他不用去理解整个框架和环境是怎么执行的 ...

  7. 各种主流 SQLServer 迁移到 MySQL 工具对比

          我之所以会写这篇对比文章,是因为公司新产品研发真实经历过这个痛苦过程(传统基于SQL Server开发的C/S产品转为MySQL云产品).首次需要数据转换是测试环节,当时为了快速验证新研发 ...

  8. .Net分布式异常报警系统-服务端Service

    服务端的2个Service 1. HandleService: 从Redis中获取异常信息, 入库并发送通知到相关责任人.  2. HealthyCheckService: 对站点指定页面进行模拟访问 ...

  9. 如何批量删除虚拟机及其关联的存储(Windows Azure)

    可以通过运行附件中PowerShell脚本文件RemoveVMandDisk.ps1批量删除VM和Disk,详细代码如下: param($serviceName) echo "Startin ...

  10. fir2(n,f,m)

    编辑 函数fir2用来设计多通带任意响应FIR滤波器,该滤波器的幅频特性由向量对f和m确定,f为归一化频率向量,m为对应频率点上的幅度.当设计的滤波器在频率为π的幅度响应不是0时,滤波器的阶数n为偶数