题目

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. JDBC技术总结(三)

    1. 数据库连接池 JDBC部分的前两个总结主要总结了一下JDBC的基本操作,而且有个共同点,就是应用程序都是直接获取数据库连接的.这会有个弊端:用户每次请求都需要向数据库获得连接,而数据库创建连接通 ...

  2. script 标签 幼儿园级别的神坑。居然还让我踩到了。

    这样的写法,会导致页面出现问题,就类似被中断了一样,百思不得其解还以为是代码出了问题. <script src="./Components/ProcessLine/ProcessLin ...

  3. java之CGLIB动态代理

    © 版权声明:本文为博主原创文章,转载请注明出处 CGLIB动态代理: CGLIB动态代理就是对指定的类生成一个子类,覆盖其中所有的方法并环绕增强 优势: - 1. 业务类只需要关注业务逻辑本身,保证 ...

  4. Android实践--监測网络状态

    Android 监測网络状态      我们在使用Android手机时候,一些APP须要网络环境才干执行,所以手机须要可用的网络,无论是2G.3G或者WIFI.甚至有一些比較耗流量的APP仅仅能在WI ...

  5. webpack 使用配置

    注意:webpack 2.0版本之后有所区别 一.插件篇 1. 自动补全css3前缀 autoprefixer 官方是这样说的:Parse CSS and add vendor prefixes to ...

  6. oracle中的minus数据比对

    1.要有唯一索引或者主键作为前提,减少数据冲突的数量,如示例标红的地方:   2.当有in查询的时候,尽量用exists,这样能提高查询效率: create table TF_F_USER_DIFF1 ...

  7. sersync简介与测试报告

    在分布式应用中会遇到一个问题,就是多个服务器间的文件如何能始终保持一致.一种经典的办法是将需要保持一致的文件存储在NFS上,这种方法虽然简单方便但却将本来多点的应用在文件存储上又变成了单点,这违背了分 ...

  8. MVC架构模式(转载)

    MVC架构模式 [概念理解] MVC模式和C++的实现 面向对象的设计模式是经验的总结,MVC思想是原先用于构建用户界面的.这篇文章主要论述了如何在新的Web应用领域中使用设计模式和MVC架构.文章首 ...

  9. MSP430G2553电子时钟实验

    用msp430g2553控制1602液晶显示时间,并能够通过按键设置时间.我做了正计时和倒计时两种模式 /*********************************************** ...

  10. mybatis介绍安装

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简单 ...