逆序对(inversion)
逆序对(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)的更多相关文章
- 逆序对 inversion
评测传送门 [问题描述] 有一个1 − n的排列,你会依次进行m次操作,第i次操作表示为(x i , y i ),交换以这两个 值为下标的元素,每次操作有一半的概率成功,你需要求出最后序列的逆序对 ...
- HDU 1394Minimum Inversion Number 数状数组 逆序对数量和
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- HDU-1394 Minimum Inversion Number 线段树+逆序对
仍旧在练习线段树中..这道题一开始没有完全理解搞了一上午,感到了自己的shabi.. Minimum Inversion Number Time Limit: 2000/1000 MS (Java/O ...
- UVA 11990 ``Dynamic'' Inversion 动态逆序对
``Dynamic'' Inversion Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/index ...
- hdu 5497 Inversion 树状数组 逆序对,单点修改
Inversion Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5497 ...
- 浙江工商大学15年校赛I题 Inversion 【归并排序求逆序对】
Inversion Time Limit 1s Memory Limit 131072KB Judge Program Standard Ratio(Solve/Submit) 15.00%(3/20 ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- SPOJ:Another Version of Inversion(二维数组的逆序对)
DCE Coders admins are way much geekier than they actually seem! Kartik has been following that tradi ...
- 线段树 逆序对 Minimum Inversion Number HDU - 1394 Laptop
Minimum Inversion Number HDU - 1394 求最小反转数,就是求最少的逆序对. 逆序对怎么求,就是先把所有的数都初始化为0,然后按照顺序放入数字,放入数字前查询从这个数往后 ...
随机推荐
- 网络编程——UDP协议和通信
第1章 UDP与TCP协议 在介绍TCP/IP结构时,提到传输层的两个重要的高级协议,分别是UDP和TCP,其中UDP是User Datagram Protocol的简称,称为用户数据报协议,TCP是 ...
- iOS进阶面试题
1. 风格纠错题 修改完的代码: 修改方法有很多种,现给出一种做示例: // .h文件 // http://weibo.com/luohanchenyilong/ // https://github. ...
- 项目实战8.1—tomcat企业级Web应用服务器配置与会话保持
分类: Linux架构篇 tomcat企业级Web应用服务器配置与实战 环境背景:公司业务经过长期发展,有了很大突破,已经实现盈利,现公司要求加强技术架构应用功能和安全性以及开始向企业应用.移动A ...
- LeetCode949-给定数字能组成的最大时间
问题: 给定一个由 4 位数字组成的数组,返回可以设置的符合 24 小时制的最大时间. 最小的 24 小时制时间是 00:00,而最大的是 23:59.从 00:00 (午夜)开始算起,过得越久,时间 ...
- JZOJ 4757. 树上摩托
Description Sherco是一位经验丰富的魔♂法师.Sherco在第零次圣杯战争中取得了胜利,并取得了王之宝藏——王の树.他想把这棵树砍去任意条边,拆成若干棵新树,并装饰在他的摩托上,让他的 ...
- 【104】Maven3.5.0结合eclipse使用,提示Lambda expressions are allowed only at source level 1.8 or above错误的解决方法
错误重现 我的机器上安装了 maven 3.5.0,在 eclipse 中创建 maven 项目.pom.xml配置如下: <project xmlns="http://maven.a ...
- 初学python来进行odoo12版本开发
这是我的第一篇博客.请多多指教! 首先要下载odoo-12的源代码 官方下载路径: https://github.com/odoo/odoo/archive/12.0.zip 随便新 ...
- music21 关联 MuseScore 和 Lilypond
在python安装 music21后,需要关联 musescore 或 lilypond 才能可以用图形化的形式看到 乐谱. 因此 在安装 music21后,需要配置环境变量,yvivid 在 mus ...
- bootmem API总结
bootmem_init()函数执行完成后,linux启动初期的bootmem分配器就初始化完成了,可以调用bootmem提供的API分配内存. 这些API在include/linux/bootmem ...
- 893E - Counting Arrays
E. Counting Arrays time limit per test 3 seconds memory limit per test 256 megabytes input standard ...