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. [转]C#鼠标拖动任意控件

    C#鼠标拖动任意控件(winform) 分类: c#2011-08-15 22:51 178人阅读 评论(0) 收藏 举报 winformc#userwindowsobjectapi using Sy ...

  2. Centos 的计划任务 crontab

    使用计划任务! crontab命令主要有3个参数: -e :编辑用户的crontab. -l :列出用户的crontab的内容. -r :删除用户的crontab的内容. 执行crontab -e,将 ...

  3. (转!)大话websocket

    邪正看眼鼻,真假看嘴唇,功名看气概,富贵看精神. ---曾国藩<冰鉴> 转自https://www.cnblogs.com/fuqiang88/p/5956363.html 原文http: ...

  4. jquery二维码生成插件_二维码生成器

    jquery二维码生成插件_二维码生成器 下载地址:jquery生成二维码.rar

  5. web前端开发企业级CSS常用命名,书写规范总结

    1.常用命名 标题: title 摘要: summary 箭头: arrow 商标: label 网站标志: logo 转角/圆角: corner 横幅广告: banner 子菜单: subMenu ...

  6. vs2017诊断工具

    vs2017诊断工具

  7. Java读取文件方法大全

    1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile {    /**     * 以字节为单位读取文件,常用于读 ...

  8. 2017-2018-2 20165233 实验三 敏捷开发与XP实践

    20165233 实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤 一.编码标准 编程标准包含:具有说明性的名字.清晰的表达式.直截了当的控制流.可读的代码和注释,以及 ...

  9. JS吧数字转成2进制 8进制16进制数据

    ; number.toString(); //转成2进制 number.toString();//转成8进制 number.toString();//转成10进制 number.toString(); ...

  10. JS实现让滚轮控制网页头部显示与隐藏

    在很多网站中都有鼠标网上滚动头部就会滑出,继续往下滚动就会隐藏,下面看看实现方法 scroll(); function scroll(){// 入口方法 这个方法是获取事件的兼容,获取delta -- ...