题目

P1393 动态逆序对

做题前写篇博客是个好方法

做法

题目规定仅有删除,给每个位置标个号,逆序对+时间轴,显然这是个三维偏序

很久没做过\(cdq\)了,就当模板题讲一下:

按删除的先后顺序为关键字排序分治,然后在\(cdq\)中按位置排序,同时前部分删除的时间<=后部分删除时间

此时前部分删除的一个点会影响到的贡献在后部分处理:1.位置大值小查询-值大数量;2.位置小值大查询-值小数量

My complete code

#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL maxn=1e5;
inline LL Read(){
LL x(0),f(1); char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1; c=getchar();
}
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*f;
}
LL n,m,ans;
LL tree[maxn],a[maxn],tmp[maxn],D[maxn],low[maxn];
inline LL Lowbit(LL x){
return x&(-x);
}
inline void Add(LL x,LL val){
for(;x<=n;x+=Lowbit(x))
tree[x]+=val;
}
inline LL Query(LL x){
LL ret(0);
for(;x;x-=Lowbit(x))
ret+=tree[x];
return ret;
}
struct node{
LL del,val,id,ans;
}q[maxn];
inline bool cmp1(node x,node y){
return x.del<y.del;
}
inline bool cmp2(node x,node y){
return x.id<y.id;
}
void Cdq(LL l,LL r){
if(l==r)
return;
LL mid(l+r>>1);
Cdq(l,mid),Cdq(mid+1,r);
sort(q+l,q+mid+1,cmp2),sort(q+mid+1,q+r+1,cmp2);
LL j=mid;
for(LL i=l;i<=mid;++i){//big
while(j<r&&q[j+1].id<q[i].id)
Add(q[++j].val,1);
q[i].ans+=Query(n)-Query(q[i].val);
}
for(LL i=mid+1;i<=j;++i)
Add(q[i].val,-1);
j=r+1;
for(LL i=mid;i>=l;--i){
while(j>mid+1&&q[j-1].id>q[i].id)
Add(q[--j].val,1);
q[i].ans+=Query(q[i].val-1);
}
for(LL i=j;i<=r;++i)
Add(q[i].val,-1);
}
int main(){
n=Read(),m=Read();
for(LL i=1;i<=n;++i)
tmp[i]=a[i]=Read();
sort(tmp+1,tmp+1+n);
for(LL i=1;i<=n;++i)
a[i]=lower_bound(tmp+1,tmp+1+n,a[i])-tmp;
for(LL i=n;i>=1;--i){
ans+=Query(a[i]-1);
Add(a[i],1);
} for(LL i=1;i<=n;++i)
q[i]=(node){n+1,a[i],i,0};
for(LL i=1;i<=m;++i){
D[i]=Read();
q[D[i]].del=i;
}
memset(tree,0,sizeof(tree));
sort(q+1,q+1+n,cmp1);
Cdq(1,n);
for(LL i=1;i<=n;++i)
low[q[i].id]=q[i].ans;
printf("%lld ",ans);
for(LL i=1;i<=m;++i){
ans-=low[D[i]];
printf("%lld ",ans);
}
return 0;
}/*
6 3
5 4 2 6 3 1
2 1 4 11 7 4 2
*/

最新文章

  1. json显示日期带T问题的解决方法
  2. 。linux桌面与命令行
  3. hihoCoder 1432 : JiLi Number(吉利数)
  4. MVC模型的理解
  5. 原创内容搬家到csdn博客啦~
  6. 如何破解excel宏的密码
  7. reactjs入门到实战(四)---- state详解
  8. Spring整合JUnit4测试
  9. Go语言相关图书推荐
  10. TreeView控件的CheckBox级联选中或取消
  11. Ubuntu升级到14.04
  12. Knockout简单用法
  13. java计算某个日期是什么节气(24节气)
  14. Vue 入门. 如何在HTML代码里面快速使用Vue
  15. python中一些传参事情
  16. centos下源码编译安装MySQL
  17. map、filter、reduce函数
  18. EXT.net 图标靠右排列
  19. JAVA JDK的安装及初步试用
  20. 用jq获取元素内文本,但不包括其子元素内的文本值的方法

热门文章

  1. 如何进入到Docker容器内部
  2. 了解MVC框架开发
  3. sql2000实现row_number
  4. .NET CORE 2.0小白笔记(四):asp.net core输出中文乱码的问题
  5. nginx根据目录反向代理到后端服务器
  6. MySQL 查询 数据库有多少表 表名是哪些
  7. webAPI 405
  8. C语言中的main函数以及main函数是如何被调用的
  9. mysql 归档方案(一次性)
  10. appium mac 下 安装及踩坑