#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. LOG4NET日志配置及使用

    Log4net的安装 Install-Package log4net 1.先弄个日志记录的类 /// <summary> /// 使用LOG4NET记录日志的功能,在WEB.CONFIG里 ...

  2. 重构Web Api程序(Api Controller和Entity)续篇

    昨天有写总结<重构Web Api程序(Api Controller和Entity)>http://www.cnblogs.com/insus/p/4350111.html,把一些数据交换的 ...

  3. 使用ViewBag传送数据从控制器至视图

    前一篇<ASP.NET MVC读取XML并使用ViewData显示>http://www.cnblogs.com/insus/p/4308740.html 中,在控制器中使用了ViewDa ...

  4. font和lineheight冲突。

    font:14px bold arial; line-height:40px; 这样写font的话line-height不会有效,只要把font拆分写就有效,chrome ie ff下都是.

  5. CodeSmith操作Access时字段的排序问题

    最近在用CodeSmith操作写ACCESS数据库的代码模版,发现CodeSmith默认的字段顺序与ACCESS中表的字段顺序不一致. 首先在ACCESS数据库中建一个测试表Test,并添加ID.Na ...

  6. C# 7.0 新特性4: 返回引用

    本文参考Roslyn项目中的Issue:#118. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...

  7. GridView的 OnRowDataBound 事件用法

    <asp:GridView ID="RptUsers" runat="server" AutoGenerateColumns="False&qu ...

  8. [BZOJ2768][JLOI2010]冠军调查(最小割)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2768 分析: 如果一个点i认为是0,则连一条S->i,如果认为是1,则i-> ...

  9. php - 上传图片之痛(建文件夹)

    $json_result ['status'] = 0; $path = '../upfile'; $json_result ['status'] = 0; $json_result ['succes ...

  10. iSCSI 与 ceph

    SCSI  小型计算机系统接口(SCSI,Small Computer System Interface)是一种用于计算机及其周边设备之间(硬盘.软驱.光驱.打印机.扫描仪等)系统级接口的独立处理器标 ...