逆序对(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. 求最大公约数和最小公倍数_python

    """写两个函数,分别求两个整数的最大公约数和最小公倍数,调用这两个函数,并输出结果.两个整数由键盘输入.""" ''' 设两个整数u和v, ...

  2. Java MD5加密算法工具类

    MD5.java package util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmExcep ...

  3. CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第六节

    原文链接 第六节:全局内存和CUDA RPOFILER  Rob Farber 是西北太平洋国家实验室(Pacific Northwest National Laboratory)的高级科研人员.他在 ...

  4. Python中的集合set

    >>> help(set) Help on class set in module __builtin__: class set(object) | set(iterable) -- ...

  5. oc字典放入到数组里,根据字典里的属性排序(重点)

    #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { ...

  6. es6展开运算符

    数组的展开合并 现在有两个数组[1, 2, 3, 4]和[5, 6, 7],想要将两个函数拼接成一个新的函数. //es5的写法 let arr1 = [1, 2, 3, 4]; let arr2 = ...

  7. JS控制台的使用

    1.快捷键F12可直接进入控制台(或者单机右键->检查)用于bug调试 2.控制台如图: Elements:表示所有的js元素 Console:常用的有如下几个功能: ①console.log: ...

  8. Linux-SSH远程登陆

    SSH是什么 Secure Shell 安全外壳协议 建立在应用层基础上的安全协议 可靠.转为远程登陆会话和其他网络提供安全性的协议 SSH客户端是用于多种平台 服务器安装SSH服务 安装:yum i ...

  9. spring MVC体系结构和请求控制器

    MVC处理过程 spring MVC架构模式都进行了分层设计如下 数据访问接口:DAO层 处理业务逻辑层:service层 数据实体:POJO 负责前端请求的接受并处理:servlet 负责前端页面展 ...

  10. nuxt.js服务端缓存lru-cache

    对于部分网页进行服务端的缓存,可以获得更好的渲染性能,但是缓存又涉及到一个数据的及时性的问题,所以在及时性和性能之间要有平衡和取舍. 官方文档里面写的使用方法 按照这个配置,试过了没什么用,但是从文档 ...