题目

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
*/

P1393 动态逆序对的更多相关文章

  1. 洛谷P1393 动态逆序对(CDQ分治)

    传送门 题解 听别人说这是洛谷用户的双倍经验啊……然而根本没有感觉到……因为另外的那题我是用树状数组套主席树做的……而且莫名其妙感觉那种方法思路更清晰(虽然码量稍稍大了那么一点点)……感谢Candy大 ...

  2. 【Luogu】P1393动态逆序对(树套树)

    题目链接 树套树. 每次删掉x的时候会减去1到x-1里比x位置的数大的数和它构成的逆序对,以及x+1到n里比x位置的数小的数和它构成的逆序对. 顺带一提我发现平衡树insert的时候不是要splay一 ...

  3. bzoj3295 洛谷P3157、1393 动态逆序对——树套树

    题目:bzoj3295 https://www.lydsy.com/JudgeOnline/problem.php?id=3295 洛谷 P3157(同一道题) https://www.luogu.o ...

  4. 【题解】动态逆序对 [CQOI2011] [P3157] [BZOJ3295] [P1393]

    [题解]动态逆序对 [CQOI2011] [P3157] [BZOJ3295] [P1393] 水一水QAQ 题目链接: \([P3157]\) \([BZOJ3295]\) [题目描述] 对于一个序 ...

  5. BZOJ 3295: [Cqoi2011]动态逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3865  Solved: 1298[Submit][Sta ...

  6. Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2886  Solved: 924[Submit][Stat ...

  7. 【Luogu1393】动态逆序对(CDQ分治)

    [Luogu1393]动态逆序对(CDQ分治) 题面 题目描述 对于给定的一段正整数序列,我们定义它的逆序对的个数为序列中ai>aj且i < j的有序对(i,j)的个数.你需要计算出一个序 ...

  8. 【BZOJ3295】动态逆序对(线段树,树状数组)

    [BZOJ3295]动态逆序对(线段树,树状数组) 题面 Description 对于序列A,它的逆序对数定义为满足iAj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的 ...

  9. bzoj3295[Cqoi2011]动态逆序对 树套树

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5987  Solved: 2080[Submit][Sta ...

随机推荐

  1. git个人使用总结(界面版)

    最近开始使用GIT来管理测试文档,从0到1开始使用git 1.首先,使用网页登录GIT后,创建项目 2.创建项目后,需要配置一下访问者权限 3.然后在网页版GIT复制地址,git clone到 本地 ...

  2. UIView的endEditing:方法

    当视图收到endEditing:消息时,如果视图(或者其下的人和子视图)是当前的第一响应对象,就会取消自己的第一响应对象状态, 而且虚拟键盘也会消失(传入的参数代表是否需要强制取消第一响应对象状态.有 ...

  3. python抓取51CTO博客的推荐博客的全部博文,对标题分词存入mongodb中

    原文地址: python抓取51CTO博客的推荐博客的全部博文,对标题分词存入mongodb中

  4. IDEA下配置Spring Boot的热部署

    © 版权声明:本文为博主原创文章,转载请注明出处 devtools简介 spring-boot-devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),因为其采用的 ...

  5. Hadoop自带Sort例子分析

    /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agree ...

  6. NYOJ 492 King (状态压缩)

    做题感悟:做完这题发现状态压缩有很多须要优化的地方. 解题思路:状态压缩 開始自己用的一般的思路,就和炮兵阵地,郑厂长等题类似的方法做的,開始超时,然后把数组开到了最小的极限就险过.然后看了别人的代码 ...

  7. CentOS 源码安装svn

    一. 下载依赖包 1. apr源码包 http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-1.5.2.tar.gz 2. apr-util源码包 h ...

  8. MySQL的max()函数使用时遇到的小问题

    通常我们获取某个表的某个字段最大值时可以使用max()函数. 使用场景举例: 获取某个表id的最大值:SQL: SELECT max(id) FROM table_name; SELECT max(` ...

  9. MySql 查询列中包含数据库的关键字

    MySQL查询列表中包含数据的关键字的处理办法是用``把关键字包起来(tab键上面的字符)

  10. 1.Python学习---helloworld

    1.首先访问http://www.python.org/download/去下载最新的python版本. 2.安装下载包,一路next. 3.为计算机添加安装目录搭到环境变量,如图把python的安装 ...