BZOJ3295 [Cqoi2011]动态逆序对 分治 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8678185.html
题目传送门 - BZOJ3295
题意
对于序列$A$,它的逆序对数定义为满足$i<j$,且$A_i>A_j$的数对$(i,j)$的个数。给$1$到$n$的一个排列,按照某种顺序依次删除$m$个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。
题解
我们首先把原题目转化成依次加入数字求总逆序对个数。
假设某一个数字被加入的时间为$t$,他的位置为$id$,它的值为$v$。
则存在两种情况,使得$i$能更新$j$。
$Situation 1:$
$t_i<t_j,id_i<id_j,v_i>v_j$
$Situation 2:$
$t_i<t_j,id_i>id_j,v_i<v_j$
于是机智的你是不是发现CDQ分治一下就秒掉了???
(其实这题如果用带修改的主席树或者树套树貌似脑子都不用动…………)
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=100005;
struct Node{
int id,v,t,res;
}a[N],b[N];
int n,m,pos[N],tree[N];
LL res[N];
int lowbit(int x){
return x&-x;
}
void add(int x,int y){
for (;x<=n;x+=lowbit(x))
tree[x]+=y;
}
int sum(int x){
int ans=0;
for (;x>0;x-=lowbit(x))
ans+=tree[x];
return ans;
}
void CDQ(int L,int R){
if (L==R)
return;
int mid=(L+R)>>1;
for (int i=L,l=L,r=mid+1;i<=R;i++)
if (a[i].t<=mid)
b[l++]=a[i];
else
b[r++]=a[i];
for (int i=L;i<=R;i++)
a[i]=b[i];
int j=L;
for (int i=mid+1;i<=R;i++){
while (j<=mid&&a[j].id<a[i].id)
add(n+1-a[j].v,1),j++;
a[i].res+=sum(n+1-a[i].v);
}
for (int i=L;i<j;i++)
add(n+1-a[i].v,-1);
j=mid;
for (int i=R;i>mid;i--){
while (j>=L&&a[j].id>a[i].id)
add(a[j].v,1),j--;
a[i].res+=sum(a[i].v);
}
for (int i=mid;i>j;i--)
add(a[i].v,-1);
CDQ(L,mid),CDQ(mid+1,R);
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++){
scanf("%d",&a[i].v);
a[i].id=pos[a[i].v]=i;
a[i].t=a[i].res=0;
}
for (int i=1,x;i<=m;i++){
scanf("%d",&x);
a[pos[x]].t=n-i+1;
}
for (int i=1,t=n-m;i<=n;i++)
if (!a[i].t)
a[i].t=t--;
memset(tree,0,sizeof tree);
CDQ(1,n);
memset(res,0,sizeof res);
for (int i=1;i<=n;i++)
res[a[i].t]+=a[i].res;
for (int i=2;i<=n;i++)
res[i]+=res[i-1];
for (int i=n;i>n-m;i--)
printf("%lld\n",res[i]);
return 0;
}
BZOJ3295 [Cqoi2011]动态逆序对 分治 树状数组的更多相关文章
- bzoj3295 [Cqoi2011]动态逆序对 cdq+树状数组
[bzoj3295][Cqoi2011]动态逆序对 2014年6月17日4,7954 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. ...
- BZOJ3295: [Cqoi2011]动态逆序对(树状数组套主席树)
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7465 Solved: 2662[Submit][Sta ...
- Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2886 Solved: 924[Submit][Stat ...
- P3157 [CQOI2011]动态逆序对(树状数组套线段树)
P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...
- BZOJ3295 动态逆序对(树状数组套线段树)
[Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6058 Solved: 2117[Submit][Status][D ...
- bzoj3295: [Cqoi2011]动态逆序对(树套树)
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- 【BZOJ 3295】动态逆序对 - 分块+树状数组
题目描述 给定一个1~n的序列,然后m次删除元素,每次删除之前询问逆序对的个数. 分析:分块+树状数组 (PS:本题的CDQ分治解法见下一篇) 首先将序列分成T块,每一块开一个树状数组,并且先把最初的 ...
- 【Luogu】P3157动态逆序对(树状数组套主席树)
题目链接 md第一道在NOILinux 下用vim做的紫题.由于我对这个操作系统不是很熟悉,似乎有什么地方搞错了,md调死.(我还打了两遍代码,调了两个小时) 但是这道题并不难,就是树状数组套上主席树 ...
- AcWing 107. 超快速排序(归并排序 + 逆序对 or 树状数组)
在这个问题中,您必须分析特定的排序算法----超快速排序. 该算法通过交换两个相邻的序列元素来处理n个不同整数的序列,直到序列按升序排序. 对于输入序列9 1 0 5 4,超快速排序生成输出0 1 4 ...
随机推荐
- sqlserver记录去重
,[emp_name] ,[gender] ,[department] ,[salary] from [employee] select * from ( select ROW_NUMBER() ov ...
- 谓词逻辑 p->q 的真假
若p为假,则q可取真或假,p->q为永真 若p为真,q为假,则p->q为假 若p为真,q为真,则p->q为真 p q p->q 0 0 1 0 1 1 1 0 0 1 1 1 ...
- 字符串匹配的Boyer-Moore(BM)算法
各种文本编辑器的"查找"功能(Ctrl+F),大多采用Boyer-Moore算法. Boyer-Moore算法不仅效率高,而且构思巧妙,容易理解.1977年,德克萨斯大学的Robe ...
- 洛谷P4630 [APIO2018]铁人两项 [广义圆方树]
传送门 又学会了一个新东西好开心呢~ 思路 显然,假如枚举了起始点\(x\)和终止点\(y\),中转点就必须在它们之间的简单路径上. 不知为何想到了圆方树,可以发现,如果把方点的权值记为双联通分量的大 ...
- ant 安装 网址
1 http://www.testautomationguru.com/jmeter-continuous-performance-testing-part1/ 2 http://www.testau ...
- Windows&Word 常用快捷键
Win:显示开始菜单 Win + E:打开文件管理器 Win + D:显示桌面 Win + L:锁定计算机 Win + I:打开设置 Win + M:最小化所有窗口 Alt + F4:1.用来关闭当前 ...
- Java的输入语句以及本周对于文件读写的研究
日期:2018.9.20 博客期:010 星期四 ##:今天下午要考试 java(小考)!那么,我就应对相应的方法给出策略吧! 首先是 Java 里的输入语句,我一般是用Scanner类,用这个之前要 ...
- 【转载】中文输入法下onKeyPress不能触发的问题
onKeypress---->oninput https://segmentfault.com/a/1190000008820968
- mysql数据库之基本操作和存储引擎
一.知识储备 数据库服务器:一台计算机(对内存要求比较高) 数据库管理系统:如mysql,是一个软件 数据库:oldboy_stu,相当于文件夹 表:student,scholl,class_list ...
- mysql 各种关系代数的使用
连接(JOIN) 选择运算表示为: R⋈S ,其中R和S为不同的两个关系 连接运算是选取两个指定关系中的属性满足给定条件的元祖连接在一起来组成一个新的关系 数学形式: JOIN 关系名1 AND 关系 ...