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 ...
随机推荐
- HDU 5033
题意: 给你 N 楼房, 然后给你m个人站在这些楼房之间, 问看到天空的仰角是多少度 思路: 对于每一个人, 算出左边的凸包, 和右边的凸包, 找出最大斜率点, 算角度即可 (我在线算比较费时, 离线 ...
- 前端 ----jQuery的动画效果
03-jQuery动画效果 jQuery提供的一组网页中常见的动画效果,这些动画是标准的.有规律的效果:同时还提供给我们了自定义动画的功能. 显示动画 方式一: $("div" ...
- iOS9 新功能:Support Universal Links,iOS10 openUrl新函数
先看官方文档:https://developer.apple.com/library/ios/documentation/General/Conceptual/AppSearch/UniversalL ...
- Confluence 6 新安装配置数据库字符集编码
Confluence 和你的数据库必须配置使用相同的字符集. Confluence 使用 UTF-8 字符集编码,所以你的数据库也必须配置为使用 UTF-8 (或者与 UTF-8 相同的编码,例如在 ...
- Confluence 6 从外部小工具中注册访问
希望从 Confluence 中删除一个小工具,你可以选择小工具边上的 URL ,然后单击删除(Delete). 如果你希望取消订阅一个应用的小工具,你需要删除整个订阅.你不能仅仅删除你订阅中的某一个 ...
- (五)STL算法
.算法 1.算法通过迭代器来操作容器中的数据: 2.算法为模板函数: 二.迭代器与算法 1.根据移动能力,将迭代器分成了五类 2.使用萃取,输出各个容器中,迭代器的类别 3.其中istream, os ...
- Saruman's Army(POJ3069)
Description Saruman the White must lead his army along a straight path from Isengard to Helm’s Deep. ...
- dbcp连接池出现的问题java.lang.AbstractMethodError: com.mysql.jdbc.Connection.isValid(I)Z
解决方案:mysql-connector 版本为 5.0.4 ,那么对应的 dbcp 和 pool 版本应该为 1.4 和 1.6 . 5.0.4 不应该使用 2.0 及以上版本的 dbcp 和 ...
- NPOI操作Excel(一)--NPOI基础
用C#读取Excel的方法有很多中,由于近期工作需要,需要解析的Excel含有合并单元格以及背景色等特殊要求,故在网上查了一些关于读Excel的方法的优缺点,觉得NPOI能满足我的需要,所以搜索了一些 ...
- Python(文件操作实例)
给定一个文件:以及给定的字符,比如“a”; 统计字符个数:(可选) # 文件的打开操作f = open("wyl.txt","r")# 文件的读取操作conte ...