BZOJ 3295 [Cqoi2011]动态逆序对 ——CDQ分治
时间、位置、数字为三个属性。
排序时间,CDQ位置,树状数组处理数字即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define maxn 100005
int a[maxn],q[maxn],n,m,pos[maxn],del[maxn];
struct Event{
int t;//时间
int x;//加入的数
int y;//加入的位置
}b[maxn];
struct Bit_Tree{
int x[maxn];
void add(int i,int f)
{
for (;i<maxn;i+=i&(-i)) x[i]+=f;
}
int gs(int i)
{
int ret=0;
for (;i;i-=i&(-i)) ret+=x[i];
return ret;
}
}BT; bool cmp1(Event a,Event b) {return a.t<b.t;} bool cmp2(Event a,Event b) {return a.y<b.y;} bool cmp3(Event a,Event b) {return a.y>b.y;} ll ans[maxn]; void CDQ(int l,int r,int flag)
{
if (l==r) return ;
int mid=l+r>>1;
CDQ(l,mid,flag); CDQ(mid+1,r,flag);
int pl=l;
if (flag) F(i,mid+1,r)
{
while (b[pl].y<b[i].y&&pl<=mid) BT.add(b[pl++].x,1);
int tmp=BT.gs(n)-BT.gs(b[i].x-1);
ans[b[i].t]+=tmp;
}
else F(i,mid+1,r)
{
while (b[pl].y>b[i].y&&pl<=mid) BT.add(b[pl++].x,1);
int tmp=BT.gs(b[i].x-1);
ans[b[i].t]+=tmp;
}
F(i,l,pl-1) BT.add(b[i].x,-1);
sort(b+l,b+r+1,flag?cmp2:cmp3);
} int main()
{
scanf("%d%d",&n,&m);
F(i,1,n) scanf("%d",&a[i]),pos[a[i]]=i;
F(i,1,m)
{
scanf("%d",&q[i]);
del[q[i]]=1;
b[i].t=n-i+1;
b[i].x=q[i];
b[i].y=pos[q[i]];
}
int now=m;
F(i,1,n)
if (!del[i])
{
b[++now].t=n-now+1;
b[now].x=i;
b[now].y=pos[i];
}
sort(b+1,b+n+1,cmp1);
CDQ(1,n,1);
sort(b+1,b+n+1,cmp1);
CDQ(1,n,0);
F(i,2,n) ans[i]+=ans[i-1];
D(i,n,n-m+1) printf("%lld\n",ans[i]);
}
BZOJ 3295 [Cqoi2011]动态逆序对 ——CDQ分治的更多相关文章
- BZOJ 3295: [Cqoi2011]动态逆序对 [CDQ分治]
RT 传送门 首先可以看成倒着插入,求逆序对数 每个数分配时间(注意每个数都要一个时间)$t$,$x$位置,$y$数值 $CDQ(l,r)$时归并排序$x$ 然后用$[l,mid]$的加入更新$[mi ...
- Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2886 Solved: 924[Submit][Stat ...
- [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 ...
- BZOJ 3295: [Cqoi2011]动态逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3865 Solved: 1298[Submit][Sta ...
- 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治
[BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...
- bzoj 3295 [Cqoi2011]动态逆序对(cdq分治,BIT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3295 [题意] n个元素依次删除m个元素,求删除元素之前序列有多少个逆序对. [思路] ...
- bzoj 3295: [Cqoi2011]动态逆序对(树套树 or CDQ分治)
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
随机推荐
- (转载)EventBus使用详解
(转载)http://liuling123.com/2016/01/EventBus-explain.html 概述 EventBus是针一款对Android的发布/订阅事件总线.它可以让我们很轻松的 ...
- Glide图片框架
//加载圆形图片Glide.with(this).load(WSCAppStatic.WEB_KEFU_PHOTO_URL+ "?usercode=8120000315") .as ...
- log4sql介绍
log4sql介绍log4j环境中简单配置的情况下可收集执行的SQL语句和JDBC执行情况,如预编译的”?“显示成参数的实际值 下载log4sql.jar第一步:http://log4sql.sour ...
- js 字符串常用操作
function Class_String_Common(){ //将字符串 myString 的 start位置 和 end位置 之间的内容替换为 replaceStr this.replace1 ...
- 系统报错undefine not symbol armv7
libz.dylib libsqlite3.dylib libstdc++.dylib 添加这些动态链接库
- 一条SQL语句在MySQL中是如何执行的
概览 本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的. 一.mysql架构分析 mysql主要分为Server层和存储 ...
- C#背景图片自适应
1.选中窗体修改属性 2.在load添加代码 private void Form1_Load(object sender, EventArgs e) { this.BackgroundImageLay ...
- 解决Genymotion2.8.1在拖动安装APK文件出现ARMtranslate错误
转载文章:http://blog.csdn.net/solo_talk/article/details/68488129 在新版本的genymotion中,我们拖动安装APK文件的时候会出现一个问题, ...
- java面试基础篇(二)
上一篇,我们说了一下线程和Map,或许那些太抽象,不太好理解,也不太方便记忆,我们这次说一些简单的. 1.Q:java的基本数据类型有哪些? A:四种整数类型(byte.short.int.long) ...
- Bootstrap历练实例:表单控件状态(焦点)
输入框焦点 当输入框 input 接收到 :focus 时,输入框的轮廓会被移除,同时应用 box-shadow. <!DOCTYPE html><html><head& ...