BZOJ3295:[CQOI2011]动态逆序对(CDQ分治)
Description
Input
Output
Sample Input
1
5
3
4
2
5
1
4
2
Sample Output
5
2
2
1
Solution
给每个被删除的元素打一个删除时间$t$,设下标为$x$,权值为$y$,那么删除一个元素后,减少的逆序对个数为:
1、$t$比它大,$x$比它小,$y$比它大。
2、$t$比它大,$x$比它大,$y$比它小。
$CDQ$统计一下就好了……
读错题把删除元素看成删除下标真的智障。
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N (100009)
#define LL long long
using namespace std; struct Que
{
int x,y,t;
bool operator < (const Que &a) const
{
return t>a.t;
}
}a[N],tmp[N]; int n,m,c[N],q[N],ans[N],pos[N];
LL sum; inline int read()
{
int x=,w=; char c=getchar();
while (c<'' || c>'') {if (c=='-') w=-; c=getchar();}
while (c>='' && c<='') x=x*+c-'', c=getchar();
return x*w;
} void Update(int x,int k)
{
for (; x<=n; x+=(x&-x)) c[x]+=k;
} int Query(int x)
{
int ans=;
for (; x; x-=(x&-x)) ans+=c[x];
return ans;
} void CDQ1(int l,int r)
{
if (l==r) return;
int mid=(l+r)>>;
CDQ1(l,mid); CDQ1(mid+,r);
int i=l,j=mid+,k=l-;
while (i<=mid || j<=r)
if (j>r || i<=mid && a[i].x<a[j].x)
{
Update(a[i].y,);
tmp[++k]=a[i]; ++i;
}
else
{
ans[a[j].y]+=Query(n)-Query(a[j].y);
tmp[++k]=a[j]; ++j;
}
for (int i=l; i<=mid; ++i) Update(a[i].y,-);
for (int i=l; i<=r; ++i) a[i]=tmp[i];
} void CDQ2(int l,int r)
{
if (l==r) return;
int mid=(l+r)>>;
CDQ2(l,mid); CDQ2(mid+,r);
int i=l,j=mid+,k=l-;
while (i<=mid || j<=r)
if (j>r || i<=mid && a[i].x>a[j].x)
{
Update(a[i].y,);
tmp[++k]=a[i]; ++i;
}
else
{
ans[a[j].y]+=Query(a[j].y-);
tmp[++k]=a[j]; ++j;
}
for (int i=l; i<=mid; ++i) Update(a[i].y,-);
for (int i=l; i<=r; ++i) a[i]=tmp[i];
} int main()
{
n=read(); m=read();
for (int i=; i<=n; ++i) a[i].x=i, a[i].y=read(), pos[a[i].y]=i;
for (int i=; i<=m; ++i) a[pos[q[i]=read()]].t=i;
for (int i=; i<=n; ++i) if (!a[i].t) a[i].t=m+; for (int i=; i<=n; ++i) sum+=Query(n)-Query(a[i].y), Update(a[i].y,);
for (int i=; i<=n; ++i) Update(a[i].y,-);
sort(a+,a+n+); CDQ1(,n);
sort(a+,a+n+); CDQ2(,n); for (int i=; i<=m; ++i) printf("%lld\n",sum), sum-=ans[q[i]];
}
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分治
[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分治模板题简单来说,这道题是三维数点对于离线的二维数点,我们再熟悉不过:利用坐标的单调递增性,先按更坐标排序,再按纵坐标排序更新和查询时都直接调用纵坐标.实际上,我们是通过排序将二维中的一维 ...
随机推荐
- C# GDI+编程之绘图
在了解绘图之前,我们先讲几个预备知识 一.坐标系 坐标系是图形设计的基础.GDI+使用三个坐标空间:世界.页面和设备,其中,世界坐标是用于建立特殊图形世界模型的坐标系,也是在.NET Framewor ...
- webpack4打包报错:WARNING in configuration The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults fo
运行命令webpack ./src/main.js ./dist/murenziwei.js后,目录上神马动静都没有,你以为在dist文件夹上会有murenziwei.js吗?毛都没有 警告和错误倒是 ...
- js a标签 + ajax 多参数穿参
<span onclick="return haoping('{$row['jv_id']}','1')"> function haoping(id,type){ $. ...
- drupal简单安装和插件安装
1.从官网下载drupal安装包:https://www.drupal.org/download 2.windows下使用WAMPSERVER作为php的服务器,在官网http://www.wamps ...
- Hash Table (youtube)
here is a link for youtube about hash table which is super good https://www.youtube.com/watch?v=h2d9 ...
- SSM(Spring+SpringMvc+Mybatis)整合笔记
1.使用开发工具 jdk1.8 eclipse Tomcat7.0 MySql 2.创建数据库和表,由于重点是整合,所以数据库就随意加几条数据. 3.创建动态Web项目(推荐使用Maven可以用配置来 ...
- js+springMVC 提交数组数据到后台
1.ajax 代码 var ids =new Array(); $.ajax({ type: "POST", url: "/user/downReport", ...
- python之数据类型
1.整数(int)integer 直接写出数字就是整数例: a = 0#查看变量的数据类型 type() -> #<class 'int'> class类,类型,类别print(10 ...
- 2018最新大厂Android面试真题
前言 又到了金三银四的面试季,自己也不得不参与到这场战役中来,其实是从去年底就开始看,android的好机会确实不太多,但也还好,3年+的android开发经历还是有一些面试机会的,不过确实不像几年前 ...
- Spooling Directory Source使用技巧
1.使用文件原来的名字 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 a1.sources=r1 a1.sinks=k1 a1.sources.r1.ty ...