#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define maxn 200001
using namespace std; typedef long long ll;
ll ans[maxn],Ans;
int n,m,tot,tsum[maxn],num[maxn],pos[maxn],sum[maxn],_num[maxn];
bool bo[maxn]; struct date{
int bo,id,x,y;
}qs[maxn],temp[maxn]; int lowbit(int x){
return x&(-x);
} void insert(int x,int y){
for (int i=x;i<=n;i+=lowbit(i)) sum[i]+=y;
} int qsum(int x){
int tmp=; for (int i=x;i;i-=lowbit(i)) tmp+=sum[i];
return tmp;
} void tinsert(int x){
for (int i=x;i<=n;i+=lowbit(i)) tsum[i]++;
} int tqsum(int x){
int tmp=;
for (int i=x;i>;i-=lowbit(i)){
tmp+=tsum[i];
}
return tmp;
} bool comp(date x,date y){
return x.x<y.x;
} bool comp2(date x,date y){
return x.id<y.id;
} void cdq_solve(int l,int r){
if (l==r) return;
int mid=(l+r)/,tmp=; cdq_solve(l,mid),cdq_solve(mid+,r);
sort(qs+l,qs+mid+,comp),sort(qs+mid+,qs+r+,comp);
for (int i=l,j=mid+;j<=r;){
for (;i<=mid&&qs[i].bo==;i++);
for (;j<=r&&qs[j].bo==;j++);
if (j>r) break;
if (qs[i].x<qs[j].x&&i<=mid) insert(qs[i].y,),tmp=i++;
else ans[qs[j].id]+=qsum(qs[j].y-),j++;
}
for (int i=l;i<=tmp;i++) if (qs[i].bo==) insert(qs[i].y,-);
} int main(){
// freopen("dtnxd.in","r",stdin);
// freopen("dtnxd.out","w",stdout);
int u,v;
memset(sum,,sizeof(sum));
memset(tsum,,sizeof(tsum)),Ans=;
memset(bo,,sizeof(bo));
memset(ans,,sizeof(ans));
scanf("%d%d",&n,&m),tot=;
for (int i=;i<=n;i++) scanf("%d",&u),pos[u]=i,_num[i]=u;
for (int i=m;i>=;i--) scanf("%d",&num[i]),bo[pos[num[i]]]=;
for (int i=n;i>=;i--){
if (bo[i]==){
Ans+=tqsum(_num[i]-);
tinsert(_num[i]);
}
}
for (int i=;i<=n;i++){
if (!bo[i]) u=_num[i],++tot,qs[tot].bo=,qs[tot].x=u,qs[tot].y=i,qs[tot].id=tot;
}
for (int i=;i<=m;i++){
u=num[i],v=pos[u];
qs[++tot].bo=,qs[tot].x=u,qs[tot].y=v,qs[tot].id=tot;
qs[++tot].bo=,qs[tot].x=u,qs[tot].y=v,qs[tot].id=tot;
}
// for (int i=1;i<=tot;i++) printf("%d %d %d %d\n",qs[i].x,qs[i].y,qs[i].bo,qs[i].id);
for (int i=;i<=tot;i++){
temp[i]=qs[i];
qs[i].x=n+-qs[i].x;
}
cdq_solve(,tot);
for (int i=;i<=tot;i++){
qs[i]=temp[i];
qs[i].y=n+-qs[i].y;
}
cdq_solve(,tot);
sort(qs+,qs+tot+,comp2);
// for (int i=1;i<=tot;i++) printf("%d %lld\n",i,ans[i]);
for (int i=;i<=tot;i++) ans[i]+=ans[i-];
for (int i=tot;i>;i--) if (qs[i].bo==) printf("%lld\n",ans[i]+Ans);
return ;
}

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

题目大意:见上一篇博客。

做法:上一篇博客中,我介绍了树套树的做法,现在我来讲讲cdq分治的做法。

求逆序对的常用做法除了用树状数组维护以外,还可以用归并排序求,其本质是cdq分治。

cdq分治做法:

题目中是删除一些数,我们可以离线,看作是往序列中不断地加入一些数每加入一个数字,我们考虑它对答案带来的影响,它对答案的影响就是ans+=目前的序列中排在它前面的比它大的数的个数+排在它后面的比它小的数的个数。简化之后就是给定若干个三元组(x,y,z),x就是题目中操作的顺序(稍微调整一下即可),y表示这个数的权值,z表示这个数的位置,这些三元组中有些是询问,有些是修改,对于询问,就是求修改中x比它的X小的、y比它的Y大的、z比它的小的个数+修改中x比它的X小的、y比它的小的、z比它的大的个数,对于这种三维偏序问题,我们考虑cdq分治,第一维分治外层,第二维排序,第三位树状数组维护即可。

cdq分治+树状数组

bzoj3295: [Cqoi2011]动态逆序对(cdq分治)的更多相关文章

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

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

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

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

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

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

  4. BZOJ3295:[CQOI2011]动态逆序对(CDQ分治)

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

  5. 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治

    [BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...

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

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

  7. [CQOI2011]动态逆序对 CDQ分治

    洛谷上有2道相同的题目(基本是完全相同的,输入输出格式略有不同) ---题面--- ---题面--- CDQ分治 首先由于删除是很不好处理的,所以我们把删除改为插入,然后输出的时候倒着输出即可 首先这 ...

  8. 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治

    题目:https://www.luogu.org/problemnew/show/3157 题解: 1.对于静态的逆序对可以用树状数组做 2.我们为了方便可以把删除当成增加,可以化动为静 3.找到三维 ...

  9. BZOJ 3295: [Cqoi2011]动态逆序对 [CDQ分治]

    RT 传送门 首先可以看成倒着插入,求逆序对数 每个数分配时间(注意每个数都要一个时间)$t$,$x$位置,$y$数值 $CDQ(l,r)$时归并排序$x$ 然后用$[l,mid]$的加入更新$[mi ...

  10. P3157 [CQOI2011]动态逆序对 CDQ分治

    一道CDQ分治模板题简单来说,这道题是三维数点对于离线的二维数点,我们再熟悉不过:利用坐标的单调递增性,先按更坐标排序,再按纵坐标排序更新和查询时都直接调用纵坐标.实际上,我们是通过排序将二维中的一维 ...

随机推荐

  1. python里的del变量无法立刻释放内存的解决办法

    最近在python开发的时候,用到了一些很占用内存的操作,导致后续程序执行很慢甚至无法执行.探索了一下,最终解决了这个问题. 截图解释: python变量占用了内存,仅仅通过del变量的方式,只是让这 ...

  2. pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat

    pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat Windows7下pip安装包报错:Microso ...

  3. handlebars+require

    handlebars+require 最近在某网站看到了handlebars.js,出于好奇就百度了下这是神马玩意,结果让我很是欢喜,于是就开始自学下,handlebars就几个方法,蛮简单,言归正传 ...

  4. Linux shell中的符号

    .单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用. 括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空 ...

  5. hadoop 2.6伪分布安装

    hadoop 2.6的“伪”分式安装与“全”分式安装相比,大部分操作是相同的,主要区别在于不用配置slaves文件,而且其它xxx-core.xml里的参数很多也可以省略,下面是几个关键的配置: (安 ...

  6. 乐易贵宾VIP教程:百度贴吧 - QQ部落 - QQ空间 Post实战系列视频课程

    教程挺不错,3套案例的实战,有需要的可以看一下百度贴吧课程目录:1.百度登录抓包分析2.百度登录[代码实现]3.百度验证码登录[代码实现]4.贴吧关注[抓包分析]5.贴吧关注(代码编写)6.贴吧签到[ ...

  7. spring发布和接收定制的事件(spring事件传播)

    spring发布和接收定制的事件(spring事件传播) 2012-12-26 20:05 22111人阅读 评论(2) 收藏 举报  分类: 开源技术(如Struts/spring/Hibernat ...

  8. Java 基础【10】 I/O流概念分析整理

    转载地址:http://blog.csdn.net/yuebinghaoyuan/article/details/7388059 java.io 中的流,可以从不同的角度进行分类. 按照数据流的方向不 ...

  9. 最清晰的Android多屏幕适配方案

    问题的引入 当您的Android应用即将发布的时候,如果你想让更多的用户去使用你的应用,摆在工程师面前的一个重要问题就是如何让你的应用能在各种各样的终端上运行,这里的各种各样首当其冲的就是不同的屏幕分 ...

  10. LaTeX常用数学符号表示方法

    转自:http://www.mohu.org/info/symbols/symbols.htm 常用数学符号的 LaTeX 表示方法 (以下内容主要摘自“一份不太简短的 LATEX2e 介绍”) 1. ...