逆序对(inversion)

题目描述

对于序列AA,它的逆序对数定义为满足i<ji<j,且Ai>AjAi>Aj 的数对i,ji,j的个数。

现给你11到nn的一个排列,并按照某种顺序依次删除mm个元素。现请你求出在每次删除一个元素之前整个序列的逆序对总个数。

输入

第一行包含两个整数nn和mm。

第二行包含nn个数,代表初始序列。

接下来的mm行,每一个整数表示第ii行,每一个整数表示第ii次删除的数(保证在此之前未曾删除过)。

输出

共mm行,表示第ii次删数前整个序列的逆对总个数。

样例输入

5 4
1 5 3 4 2
5
1
4
2

样例输出

5
2
2
1

提示


动态逆序对

假设删除时间为ti,值为xi,下标idi

如果i要对j进行贡献

必须满足tj,idixj" class="mathcode" src="https://private.codecogs.com/gif.latex?ti%3Etj%2Cidi%3Cidj%2Cxi%3Exj">

tj,idi>idj,xi

三维偏序就CDQ啦

看错题调一天

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 1000005
#define ll long long
using namespace std;
int n,m,c;
ll sum[maxn],tree[maxn],ans[maxn];
int p[maxn];
struct node{
int id,x,t;
}s[maxn],a[maxn];
bool cmp(node a,node b){
return a.t>b.t;
}
bool X(node a,node b){
return a.x>b.x;
}
bool ID(node a,node b){
return a.id>b.id;
}
void jia(int k,int val){
for(int i=k;i<=n;i+=i&-i)tree[i]+=val;
}
ll ask(int k){
ll su=0;
for(int i=k;i;i-=i&-i)su+=tree[i];
return su;
}
void cdq(int l,int r){
if(l==r)return;
int mid=(l+r)>>1;
cdq(l,mid);cdq(mid+1,r);
sort(s+l,s+mid+1,X);sort(s+mid+1,s+r+1,X);
//cout<<l<<' '<<r<<endl;
int i=l;
for(int j=mid+1;j<=r;j++){
while(s[i].x>s[j].x&&i<=mid){
jia(s[i].id,1);i++;
//cout<<s[i].id<<' ';
}
ans[s[j].t]+=ask(s[j].id);
}
for(int j=l;j<i;j++)jia(s[j].id,-1);
//merge(s+l,s+mid+1,s+mid+1,s+r+1,a,X);
//for(int i=0;i<=l+r-1;i++)s[i+l]=a[i];
} void cd(int l,int r){
if(l==r)return;
int mid=(l+r)>>1;
cd(l,mid);cd(mid+1,r);
sort(s+l,s+mid+1,ID);sort(s+mid+1,s+r+1,ID);
int i=l;
for(int j=mid+1;j<=r;j++){
while(s[i].id>s[j].id&&i<=mid){
jia(s[i].x,1);i++;
}
ans[s[j].t]+=ask(s[j].x);
}
for(int j=l;j<i;j++)jia(s[j].x,-1);
//merge(s+l,s+mid+1,s+mid+1,s+r+1,a,ID);
//for(int i=0;i<=l+r-1;i++)s[i+l]=a[i];
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%d",&s[i].x);p[s[i].x]=i;
s[i].id=i;
}
for(int i=1;i<=m;i++){
scanf("%d",&c);
s[p[c]].t=i;
}
int top=m;
for(int i=1;i<=n;i++)if(!s[i].t)s[i].t=++top;
sort(s+1,s+n+1,cmp);
cdq(1,n);
sort(s+1,s+n+1,cmp);
cd(1,n);
for(int i=n;i>=1;i--)sum[i]=sum[i+1]+ans[i];
// for(int i=1;i<=n;i++) cout<<ans[i]<<" ";cout<<endl;
for(int i=1;i<=m;i++){
printf("%lld\n",sum[i]);
}
return 0;
}

逆序对(inversion)的更多相关文章

  1. 逆序对 inversion

      评测传送门 [问题描述] 有一个1 − n的排列,你会依次进行m次操作,第i次操作表示为(x i , y i ),交换以这两个 值为下标的元素,每次操作有一半的概率成功,你需要求出最后序列的逆序对 ...

  2. HDU 1394Minimum Inversion Number 数状数组 逆序对数量和

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  3. HDU-1394 Minimum Inversion Number 线段树+逆序对

    仍旧在练习线段树中..这道题一开始没有完全理解搞了一上午,感到了自己的shabi.. Minimum Inversion Number Time Limit: 2000/1000 MS (Java/O ...

  4. UVA 11990 ``Dynamic'' Inversion 动态逆序对

    ``Dynamic'' Inversion Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/index ...

  5. hdu 5497 Inversion 树状数组 逆序对,单点修改

    Inversion Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5497 ...

  6. 浙江工商大学15年校赛I题 Inversion 【归并排序求逆序对】

    Inversion Time Limit 1s Memory Limit 131072KB Judge Program Standard Ratio(Solve/Submit) 15.00%(3/20 ...

  7. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

  8. SPOJ:Another Version of Inversion(二维数组的逆序对)

    DCE Coders admins are way much geekier than they actually seem! Kartik has been following that tradi ...

  9. 线段树 逆序对 Minimum Inversion Number HDU - 1394 Laptop

    Minimum Inversion Number HDU - 1394 求最小反转数,就是求最少的逆序对. 逆序对怎么求,就是先把所有的数都初始化为0,然后按照顺序放入数字,放入数字前查询从这个数往后 ...

随机推荐

  1. webpack 4.x 解决 webpack-dev-server工具在webpack构建的项目中使用问题

    webpack-dev-server工具能实现自动打包编译和热更新 首先将webpack-dev-server安装到项目中 npm install webpack-dev-server -D 这时在命 ...

  2. mount: no medium found on /dev/sr0 找不到介质

    在VMware虚拟机中配置yum源时,执行 mount /dev/cdrom /mnt/cdrom 出现 mount: no medium found on /dev/sr0. 首先在/mnt 目录下 ...

  3. LeetCode948-令牌放置

    问题:令牌放置 你的初始能量为 P,初始分数为 0,只有一包令牌. 令牌的值为 token[i],每个令牌最多只能使用一次,可能的两种使用方法如下: 如果你至少有 token[i] 点能量,可以将令牌 ...

  4. NoSQL - KVstore -Redis

    Redis键迁移 在使用Redis的过程中,很多时候我们会遇到需要进行键迁移的问题,需要将指定Redis中的指定数据迁移到其他Redis当中,键迁移有三种方法,我们来进行一一介绍. 一.move mo ...

  5. 宏基笔记本升级bios(2012-12-28-bd 写的日志迁移

    首先到宏基官网下载中心 去下载你需要的新版本的bios安装包如图: 我的是宏基4750g的win7旗舰版64位,这里一定要根据自己的电脑的型号和安装的系统来选择,你可以选择最新的版本也可以选择老的版本 ...

  6. CCPC 2016-2017, Finals

    A. HDU 5999 The Third Cup is Free 简单模拟. B. HDU 6000 Wash n 件衣服, m 个洗衣机,k 个烘干机.每个洗衣机和烘干机需要不同的时间.问 n 件 ...

  7. 笔记-http-header

    笔记-http-header 1.      Requests部分 Host:请求的web服务器域名地址 User-Agent:HTTP客户端运行的浏览器类型的详细信息.通过该头部信息,web服务器可 ...

  8. vim编辑器最简单使用方法

    i 输入模式 :q 不保存退出 :q! 强制退出 :wq 保存退出 j 下 k 上 h 左 l 右 gg start G end x 往后删 X 往前删 yy 复制行 p 粘贴 dd 剪切行 u 撤销 ...

  9. 异步消息处理机制,UI更新

    UI只能在主线程中完成更新,在子线程中更新UI报错如下 Only the original thread that created a view hierarchy can touch its vie ...

  10. windows server 2008解决无法PING通问题

    今天安装服务器(server 2008),配置完IP地址后,发现局域网其它电脑无法PING通服务器,测线仪测试链路都正常,网线接别的电脑也正常,以为是网卡问题,于是ping了自己的IP,发现能PING ...