BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组
BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组
Description
Input
Output
Sample Input
1
5
3
4
2
5
1
4
2
Sample Output
5
2
2
1
样例解释
(1,5,3,4,2)(1,3,4,2)(3,4,2)(3,2)(3)。
设每个值v删除的时间为t,位置为p。
对于那些没有删除的值,可以当成删除时间为n+1。
于是我们要统计删除一个数后逆序对数量变少了多少。
即统计删除时间大于tx,位置小于px,值大于vx的y的个数。
和删除时间大于tx,位置大于px,值小于vx的y的个数。
按删除时间从大到小排序,然后CDQ分治内部按位置排序,分别统计这两部分。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100050
typedef long long ll;
int b[N],pos[N],n,m,c[N],is[N];
ll ans[N],lstans;
struct A {
int t,p,v;
}a[N],t[N];
bool cmp(const A &x,const A &y) {
return x.t>y.t;
}
void fix(int x,int v) {for(;x<=n;x+=x&(-x)) c[x]+=v;}
ll inq(int x) {ll re=0;for(;x;x-=x&(-x)) re+=c[x]; return re;}
void solve(int l,int r) {
if(l==r) return ;
int mid=(l+r)>>1;
solve(l,mid); solve(mid+1,r);
int i=l,j=l,k=mid+1;
while(j<=mid&&k<=r) {
if(a[j].p<a[k].p) fix(a[j].v,1),t[i++]=a[j++];
else ans[a[k].t]+=inq(n)-inq(a[k].v),t[i++]=a[k++];
}
while(j<=mid) fix(a[j].v,1),t[i++]=a[j++];
while(k<=r) ans[a[k].t]+=inq(n)-inq(a[k].v),t[i++]=a[k++];
for(i=l;i<=mid;i++) fix(a[i].v,-1); j=mid,k=r;
while(j>=l&&k>=mid+1) {
if(a[j].p>a[k].p) fix(a[j].v,1),j--;
else ans[a[k].t]+=inq(a[k].v-1),k--;
}
while(j>=l) fix(a[j].v,1),j--;
while(k>=mid+1) ans[a[k].t]+=inq(a[k].v-1),k--;
for(i=l;i<=mid;i++) fix(a[i].v,-1);
for(i=l;i<=r;i++) a[i]=t[i];
}
int main() {
scanf("%d%d",&n,&m);
int i,j;
for(i=1;i<=n;i++) scanf("%d",&b[i]),lstans+=i-1-inq(b[i]),pos[b[i]]=i,fix(b[i],1);
memset(c,0,sizeof(c));
for(i=1;i<=m;i++) {
scanf("%d",&a[i].v); a[i].p=pos[a[i].v]; a[i].t=i; is[a[i].v]=1;
}
for(j=m,i=1;i<=n;i++) {
if(!is[i]) a[++j]=(A){n+1,pos[i],i};
}
sort(a+1,a+n+1,cmp);
solve(1,n);
//for(i=1;i<=m;i++) printf("%lld\n",ans[i]);
for(i=1;i<=m;i++) printf("%lld\n",lstans),lstans-=ans[i];
}
BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组的更多相关文章
- bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)
3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...
- [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...
- 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治
[BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...
- [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 ...
- BZOJ_3262_陌上花开_CDQ分治+树状数组
BZOJ_3262_陌上花开_CDQ分治+树状数组 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的 ...
- BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组
BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组 Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , , 之后, ...
- BZOJ3295 [Cqoi2011]动态逆序对 —— CDQ分治
题目链接:https://vjudge.net/problem/HYSBZ-3295 3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 1 ...
随机推荐
- BZOJ——1614: [Usaco2007 Jan]Telephone Lines架设电话线
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1930 Solved: 823[Submit][Status][Discuss] Description ...
- Spring实战Day6
3.4 bean的作用域 Spring中bean的作用域 单例(Singleton):在整个应用中,只创建bean的一个实例. 原型(Prototype):每次注入或者通过Spring应用上下文获取的 ...
- Effective Java P2 Creating and Destroying Objects
This chapter concerns creating and destorying objects : when and how to create them, when and how to ...
- 4.JAVA语言基础部分—枚举与泛型
枚举 //定义枚举 enum MyEnum{ ITEM_A, ITEM_B } public static void main(String[] args) { //values()获取所枚举项的集合 ...
- Spring的Bean定义
以下内容引用自http://wiki.jikexueyuan.com/project/spring/bean-definition.html: Bean定义 被称作bean的对象是构成应用程序的支柱也 ...
- Go -- 漫谈IM通信架构
前前后后做的IM和推送系统已经有好几个了,一直都想好好总结下,因此就有了这篇文章.在我刚学编程的那会儿,觉得网络通信是一个很牛逼和门槛很高的一门技术,但是随着开源技术的发展和互联网知识的共享,现在要写 ...
- MVP模式是你的救命稻草吗?
为什么要学习架构? 不管是MVC还是MVP,亦或则其他架构,它们的设计目的都是为了达到编码的最高境界,那就是:低藕合,高复用,易测试,好维护. 而要达到这个终极目标,首先要理解的是每个部分各自负责些什 ...
- flask结合令牌桶算法实现上传和下载速度限制
限流.限速: 1.针对flask的单个路由进行限流,主要场景是上传文件和下载文件的场景 2.针对整个应用进行限流,方法:利用nginx网关做限流 本文针对第一中情况,利用令牌桶算法实现: 这个方法:h ...
- 深度神经网络多任务学习(Multi-Task Learning in Deep Neural Networks)
https://cloud.tencent.com/developer/article/1118159 http://ruder.io/multi-task/ https://arxiv.org/ab ...
- UP Board USB无线网卡选购指南
前言 原创文章,转载引用务必注明链接,水平有限,欢迎指正. 本文环境:ubilinux 3.0 kernel 4.4.0 本文使用Markdown写成,为获得更好的阅读体验和正常的图片.链接,请访问我 ...