逆序对(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,然后按照顺序放入数字,放入数字前查询从这个数往后 ...
随机推荐
- UVA1629 Cake slicing
题目传送门 直接暴力定义f[x1][y1][x2][y2]是使对角为\((x1, y1),(x2, y2)\)这个子矩形满足要求的最短切割线长度 因为转移顺序不好递推,采用记忆化搜索 #include ...
- java调用摄像头
http://blog.csdn.net/xing_sky/article/details/43482213 原文地址:http://blog.csdn.net/zajin/article/detai ...
- 用gulp把less文件编译成css文件
第一次使用gulp构建工具,使用gulp将.less文件编译成.css文件并输出.根据视频做了笔记.提供新手和自己以后做参考. HTML文件 <!DOCTYPE html> <htm ...
- 谭浩强 c++程序设计第一章课后习题 第7题
#include <iostream> using namespace std; int main() { int a,b,c; int f(int x,int y,int z);//这是 ...
- node 日志分割-pm2-logrotate
使用pm2-logrotate进行pm2日志切割,测试是按照文件大小1k切割: 安装 pm2 install pm2-logrotate 设置 重启 截图 截图是按照文件大小分割,如果文件小于设置分割 ...
- ecshop里操作session与cookie
目录 操作session 操作cookie html模板里提交保存用用户名 php里 js里保存cookie js里读取cookie html模板里smart的保留变量 html模板里取session ...
- 千万不要错过这几道Python面试题,Python面试题No16
第1题: python下多线程的限制以及多进程中传递参数的方式? python多线程有个全局解释器锁(global interpreter lock),简称GIL,这个GIL并不是python的特性, ...
- 网络编程协议(TCP和UDP协议,粘包问题)以及socketserver模块
网络编程协议 1.osi七层模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...
- HUD:3746-Cyclic Nacklace(补齐循环节)
Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Pro ...
- P1605迷宫
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...