bzoj3295: [Cqoi2011]动态逆序对(cdq分治)
#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分治)的更多相关文章
- [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...
- bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)
3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...
- BZOJ3295 [Cqoi2011]动态逆序对 —— CDQ分治
题目链接:https://vjudge.net/problem/HYSBZ-3295 3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 1 ...
- BZOJ3295:[CQOI2011]动态逆序对(CDQ分治)
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
- 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治
[BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...
- bzoj3295 [Cqoi2011]动态逆序对 cdq+树状数组
[bzoj3295][Cqoi2011]动态逆序对 2014年6月17日4,7954 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. ...
- [CQOI2011]动态逆序对 CDQ分治
洛谷上有2道相同的题目(基本是完全相同的,输入输出格式略有不同) ---题面--- ---题面--- CDQ分治 首先由于删除是很不好处理的,所以我们把删除改为插入,然后输出的时候倒着输出即可 首先这 ...
- 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治
题目:https://www.luogu.org/problemnew/show/3157 题解: 1.对于静态的逆序对可以用树状数组做 2.我们为了方便可以把删除当成增加,可以化动为静 3.找到三维 ...
- BZOJ 3295: [Cqoi2011]动态逆序对 [CDQ分治]
RT 传送门 首先可以看成倒着插入,求逆序对数 每个数分配时间(注意每个数都要一个时间)$t$,$x$位置,$y$数值 $CDQ(l,r)$时归并排序$x$ 然后用$[l,mid]$的加入更新$[mi ...
- P3157 [CQOI2011]动态逆序对 CDQ分治
一道CDQ分治模板题简单来说,这道题是三维数点对于离线的二维数点,我们再熟悉不过:利用坐标的单调递增性,先按更坐标排序,再按纵坐标排序更新和查询时都直接调用纵坐标.实际上,我们是通过排序将二维中的一维 ...
随机推荐
- LOG4NET日志配置及使用
Log4net的安装 Install-Package log4net 1.先弄个日志记录的类 /// <summary> /// 使用LOG4NET记录日志的功能,在WEB.CONFIG里 ...
- 重构Web Api程序(Api Controller和Entity)续篇
昨天有写总结<重构Web Api程序(Api Controller和Entity)>http://www.cnblogs.com/insus/p/4350111.html,把一些数据交换的 ...
- 使用ViewBag传送数据从控制器至视图
前一篇<ASP.NET MVC读取XML并使用ViewData显示>http://www.cnblogs.com/insus/p/4308740.html 中,在控制器中使用了ViewDa ...
- font和lineheight冲突。
font:14px bold arial; line-height:40px; 这样写font的话line-height不会有效,只要把font拆分写就有效,chrome ie ff下都是.
- CodeSmith操作Access时字段的排序问题
最近在用CodeSmith操作写ACCESS数据库的代码模版,发现CodeSmith默认的字段顺序与ACCESS中表的字段顺序不一致. 首先在ACCESS数据库中建一个测试表Test,并添加ID.Na ...
- C# 7.0 新特性4: 返回引用
本文参考Roslyn项目中的Issue:#118. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...
- GridView的 OnRowDataBound 事件用法
<asp:GridView ID="RptUsers" runat="server" AutoGenerateColumns="False&qu ...
- [BZOJ2768][JLOI2010]冠军调查(最小割)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2768 分析: 如果一个点i认为是0,则连一条S->i,如果认为是1,则i-> ...
- php - 上传图片之痛(建文件夹)
$json_result ['status'] = 0; $path = '../upfile'; $json_result ['status'] = 0; $json_result ['succes ...
- iSCSI 与 ceph
SCSI 小型计算机系统接口(SCSI,Small Computer System Interface)是一种用于计算机及其周边设备之间(硬盘.软驱.光驱.打印机.扫描仪等)系统级接口的独立处理器标 ...