P3157 [CQOI2011]动态逆序对

https://www.luogu.org/problemnew/show/P3157

题目描述

对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。

输入输出格式

输入格式:

输入第一行包含两个整数n和m,即初始元素的个数和删除的元素个数。以下n行每行包含一个1到n之间的正整数,即初始排列。以下m行每行一个正整数,依次为每次删除的元素。

输出格式:

输出包含m行,依次为删除每个元素之前,逆序对的个数。

输入输出样例

输入样例#1:

5 4
1
5
3
4
2
5
1
4
2
输出样例#1:

5
2
2
1 样例解释
(1,5,3,4,2) (1,3,4,2) (3,4,2) (3,2) (3)。

说明

N<=100000 M<=50000

树状数组套主席树

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
#define N 100005
using namespace std; struct sair{
int l,r,sum;
}tree[N*];
int n;
int root[N],a[N],b[N],c[N],cnt;
void Add(int x){
while(x<=n){
c[x]++;
x+= x&(-x);
}
} int getsum(int x){
int sum=;
while(x){
sum+=c[x];
x-= x&(-x);
}
return sum;
} void add(int cur,int l,int r,int p,int v){
tree[cur].sum+=v;
if(l==r){
return;
}
int mid=(l+r)/;
if(p<=mid){
if(!tree[cur].l){
tree[cur].l=++cnt;
}
add(tree[cur].l,l,mid,p,v);
}
else{
if(!tree[cur].r){
tree[cur].r=++cnt;
}
add(tree[cur].r,mid+,r,p,v);
}
} int query(int L,int R,int cur,int l,int r){
if(!cur){
return ;
}
if(L<=l&&R>=r){
return tree[cur].sum;
}
int mid=(l+r)/;
int ans=;
if(L<=mid) ans+=query(L,R,tree[cur].l,l,mid);
if(R>mid) ans+=query(L,R,tree[cur].r,mid+,r);
return ans;
} int main(){
int m,v,p,j;
scanf("%d %d",&n,&m);
long long ans=;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
b[a[i]]=i;
Add(a[i]);
ans+=getsum(n)-getsum(a[i]);
for(j=i;j<=n;j+= j&(-j)){
if(!root[j]){
root[j]=++cnt;
}
add(root[j],,n,a[i],);
}
}
for(int i=;i<=m;i++){
printf("%lld\n",ans);
scanf("%d",&v);
p=b[v];
j=p-;
while(j){
ans-=query(v+,n,root[j],,n);
j-= j&(-j);
}
j=n;
while(j){
ans-=query(,v-,root[j],,n);
j-= j&(-j);
}
j=p;
while(j){
ans+=query(,v-,root[j],,n);
j-= j&(-j);
}
j=p;
while(j<=n){
add(root[j],,n,v,-);
j+= j&(-j);
}
}
}

P3157 [CQOI2011]动态逆序对的更多相关文章

  1. P3157 [CQOI2011]动态逆序对(树状数组套线段树)

    P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...

  2. 洛谷 P3157 [CQOI2011]动态逆序对 解题报告

    P3157 [CQOI2011]动态逆序对 题目描述 对于序列\(A\),它的逆序对数定义为满足\(i<j\),且\(A_i>A_j\)的数对\((i,j)\)的个数.给\(1\)到\(n ...

  3. P3157 [CQOI2011]动态逆序对 (CDQ解决三维偏序问题)

    P3157 [CQOI2011]动态逆序对 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任 ...

  4. [Luogu P3157][CQOI2011]动态逆序对 (树套树)

    题面 传送门:[CQOI2011]动态逆序对 Solution 一开始我看到pty巨神写这套题的时候,第一眼还以为是个SB题:这不直接开倒车线段树统计就完成了吗? 然后冷静思考了一分钟,猛然发现单纯的 ...

  5. 洛谷 P3157 [CQOI2011]动态逆序对(树套树)

    题面 luogu 题解 树套树(树状数组套动态开点线段树) 静态使用树状数组求逆序对就不多说了 用线段树代替树状数组,外面套树状数组统计每个点逆序对数量 设 \(t1[i]\)为\(i\)前面有多少个 ...

  6. 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治

    题目:https://www.luogu.org/problemnew/show/3157 题解: 1.对于静态的逆序对可以用树状数组做 2.我们为了方便可以把删除当成增加,可以化动为静 3.找到三维 ...

  7. luogu P3157 [CQOI2011]动态逆序对(CDQ分治)

    题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序 ...

  8. 洛谷P3157 [CQOI2011]动态逆序对

    题目大意: 给定\(1\)到\(n\)的一个排列,按照给定顺序依次删除\(m\)个元素,计算每个元素删除之前整个序列的逆序对数量 基本套路:删边变加边 那么我们不就是求满足\(pos_i<pos ...

  9. Luogu P3157 [CQOI2011]动态逆序对

    题目链接 \(Click\) \(Here\) 这个题有点卡常数..我的常数比较大所以是吸着氧气跑过去的... 题意:计算对于序列中每个位置\(p\),\([1,p-1]\)区间内比它大的数的个数,和 ...

随机推荐

  1. 1111 Online Map (30 分)

    1111 Online Map (30 分) Input our current position and a destination, an online map can recommend sev ...

  2. [UE4]ue4 c++学习推荐

    我由易到难推荐,不过在此之前还是先看看官方对于VS设置的推荐: https://docs.unrealengine.com/latest/INT/Programming/Development/Vis ...

  3. mysql导入导出数据中文乱码解决方法小结(1、navicat导入问题已解决,创建连接后修改连接属性,选择高级->将使用Mysql字符集复选框去掉,下拉框选择GBK->导入sql文件OK;2、phpmyadmin显示乱码的问题也解决,两步:1.将sql文件以utf8的字符集编码另存,2.将文件中sql语句中的字段字符集编码改成utf8,导入OK)

    当向 MySQL 数据库插入一条带有中文的数据形如 insert into employee values(null,'张三','female','1995-10-08','2015-11-12',' ...

  4. 最简单的TCP、UDP案例及各函数的详细解释

    TCP: server #include "stdafx.h" #include<iostream> #define BUF_SZIE 64 #include &quo ...

  5. js实现复选框的全选和全不选

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  6. tornado-请求与响应

    import tornado.ioloop import tornado.web import tornado.httpserver # 非阻塞 import tornado.options # 提供 ...

  7. [Dart] Flutter开发中的几个常用函数

    几个Flutter开发中的常用函数 /** 返回当前时间戳 */ static int currentTimeMillis() { return new DateTime.now().millisec ...

  8. Redis 通用操作1

    01, 设置值 => set key value  01.1, 设置值并添加有效期 => set key value ex 秒数 或者 set key value px 毫秒数 01.2, ...

  9. JAVA Spring 面向切面编程 基本案例(AOP)

    < 1 > 配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&q ...

  10. spring集成多个rabbitMQ

    转自:https://blog.csdn.net/zz775854904/article/details/81092892 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用 ...