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分治模板题简单来说,这道题是三维数点对于离线的二维数点,我们再熟悉不过:利用坐标的单调递增性,先按更坐标排序,再按纵坐标排序更新和查询时都直接调用纵坐标.实际上,我们是通过排序将二维中的一维 ...
随机推荐
- Javascript Math.ceil()与Math.round()与Math.floor()区别
Math.ceil()向上舍入 1 2 3 alert(Math.ceil(20.1)) //输出 21 alert(Math.ceil(20.5)) //输出 21 alert(Math.ceil( ...
- C#中使用Log4net日志输出到本地文件、Textbox或Listview
网上很多配置log4net的方法,但是排行靠前的 根本就没有说明清除,导致浪费了两个小时来搞清楚如何配置,真是无语,特写此文,给那些刚接触log4net的朋友 1.参考链接:http://blog.s ...
- mvc5 Html.EditorFor html属性有了新变化,和以前的不同了
@Html.EditorFor(model => model.MaxNumber, new { htmlAttributes = new { @min = "1" } })
- Apache下开启SSI配置使html支持include包含
写页面的同学通常会遇到这样的烦恼,就是页面上的 html 标签越来越多的时候,寻找指定的部分就会很困难,那么能不能像 javascript 一样写在不同的文件中引入呢?答案是有的,apache 能做到 ...
- C#微信公众号开发系列教程五(接收事件推送与消息排重)
微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...
- 实用工具 : Xaml Power Toys
最近挺忙, 憋了一肚子的东西没有分享. 今天分享一个 Xamarin.Forms / WPF 的增强工具 , Visual Studio 扩展 : Xaml Power Toy 可以直接在 VS201 ...
- 几张图弄明白ios布局中的尺寸问题
背景 先说说逆向那事.各种曲折..各种技术过时,老老实实在啃看雪的帖子..更新会有的. 回正题,这里讨论的是在Masnory框架下的布局问题.像我这种游击队没师傅带,什么都得自己琢磨,一直没闹明白下面 ...
- web性能优化——简介
简介 性能优化的第一准则:加缓存.几乎绝大部分优化都围绕这个来进行的.让用户最快的看到结果. 性能优化的第二准则:最小原则.绝不提供多余的信息.比如,静态资源(图片.css.js)压缩,图片的滚动加载 ...
- Scala函数式编程进阶
package com.dtspark.scala.basics /** * 函数式编程进阶: * 1,函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量: * 2, 函数更长用的方式 ...
- How to build windows azure PowerShell Source Code
Download any version source code of Windows Azure Powershell from https://github.com/Azure/azure-sdk ...