牛客多校第五场-D-inv
链接:https://www.nowcoder.com/acm/contest/143/D
来源:牛客网
题目描述
输入描述:
The first line has a positive even integer n The second line has n/2 positive even integers b[i]
输出描述:
Output the number of inverse pair of the permutation you find.
输入例子:
6
2 6 4
输出例子:
2
-->
备注:
1≤ n≤ 2e5
题意就是给你1-n之间所有偶数的一个排列,让你把奇数插入进去,使得生成的数列的逆序数最少。 为了使得逆序数最少,所有的奇数肯定是有序插入的,因此插入的位置肯定也是递增的。
对每个奇数找到插入之后产生逆序数最少的位置插入即可。 考虑用c[i]表示将当前奇数 2k+ 插入第i个位置时,产生的逆序数。
那么对于 (k+) + 来说,c数组的变化其实是非常小的。
对于所有在 (k+) 这个数字之前的位置来说,放2(k+)+1比放2k+1会多一个逆序数,而在它之后的位置会少一个。 因此用线段树维护c数组,每次选择逆序数最少的位置放即可。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+;
int n,m;
int c[N],mn[N*],lazy[N*],t[N*],b[N],pos[N];
ll ans;
int lowbit(int x)
{
return x&(-x);
}
void add(int x)
{
for (int i=x;i<=n;i+=lowbit(i))
t[i]++;
}
int sum(int x)
{
int ret=;
for (int i=x;i>=;i-=lowbit(i))
ret+=t[i];
return ret;
}
void PushUp(int s)
{
mn[s]=min(mn[s<<],mn[s<<|]);
}
void PushDown(int s,int lenl,int lenr)
{
if (lazy[s])
{
mn[s<<]+=lazy[s];
mn[s<<|]+=lazy[s];
lazy[s<<]+=lazy[s];
lazy[s<<|]+=lazy[s];
lazy[s]=;
}
}
void build(int s,int l,int r)
{
if (l==r)
{
mn[s]=c[l];
return ;
}
int mid=(l+r)>>;
build(s<<,l,mid);
build(s<<|,mid+,r);
PushUp(s);
}
void Updata(int s,int l,int r,int L,int R,int val)
{
if (L<=l&&r<=R)
{
mn[s]+=val;
lazy[s]+=val;
return ;
}
int mid=(l+r)>>;
PushDown(s,mid-l+,r-mid);
if (L<=mid) Updata(s<<,l,mid,L,R,val);
if (R>mid) Updata(s<<|,mid+,r,L,R,val);
PushUp(s);
}
int main()
{
scanf("%d",&n);
int m=n/;
for (int i=;i<=m;i++)
{
scanf("%d",&b[i]);
pos[b[i]]=i;
add(b[i]);
ans+=i-sum(b[i]);
} m++;
for (int i=;i<=m+;i++) c[i]=i-;
build(,,m);
for (int i=;i<=n;i+=)
{
Updata(,,m,,pos[i-],);
Updata(,,m,pos[i-]+,m,-);
ans+=mn[];
} printf("%lld\n",ans);
return ;
}
牛客多校第五场-D-inv的更多相关文章
- 牛客多校第五场 F take
链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 题目描述 Kanade has n boxes , the i-th box has p[i] ...
- 牛客多校第五场 J:Plan
链接:https://www.nowcoder.com/acm/contest/143/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
- 牛客多校第五场 F take 期望转化成单独事件概率(模板) 树状数组
链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 Kanade has n boxes , the i-th box has p[i] proba ...
- 牛客多校第五场 E room 二分图匹配 KM算法模板
链接:https://www.nowcoder.com/acm/contest/143/E来源:牛客网 Nowcoder University has 4n students and n dormit ...
- 字符串dp——牛客多校第五场G
比赛的时候脑瘫了没想出来..打多校以来最自闭的一场 显然从s中选择大于m个数组成的数必然比t大,所以只要dp求出从s中选择m个数大于t的方案数 官方题解是反着往前推,想了下反着推的确简单,因为高位的数 ...
- 【魔改】树状数组 牛客多校第五场I vcd 几何+阅读理解
https://www.nowcoder.com/acm/contest/143/I vc-dimension 题解:分三种情况,组合数学算一下,其中一种要用树状数组维护 技巧(来自UESTC):1. ...
- 2018牛客多校第五场 H.subseq
题意: 给出a数组的排列.求出字典序第k小的b数组的排列,满足1<=bi<=n,bi<bi+1,a[b[i]]<a[b[i+1]],m>0. 题解: 用树状数组倒着求出以 ...
- 2018牛客多校第五场 E.room
题意: 一共有n个宿舍,每个宿舍有4个人.给出第一年的人员分布和第二年的人员分布,问至少有多少人需要移动. 题解: 对于第一年的每个宿舍,向今年的每种组合连边.流量为1,费用为(4 - 组合中已在该宿 ...
- generator 1(2019年牛客多校第五场B题+十进制矩阵快速幂)
目录 题目链接 思路 代码 题目链接 传送门 思路 十进制矩阵快速幂. 代码 #include <set> #include <map> #include <deque& ...
随机推荐
- KVM存储虚拟化---玩转openstack
KVM 的存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的. Storage Pool 是宿主机上可以看到的一片存储空间,可以是多种类型,后面会详细讨论.Volume 是 ...
- ArrayList中modCount的作用
在ArrayList中有个成员变量modCount,继承于AbstractList. 这个成员变量记录着集合的修改次数,也就每次add或者remove它的值都会加1.这到底有什么用呢? 先看下面一段测 ...
- Uncaught Error: Syntax error, unrecognized expression: |117的js错误
117指的是js代码在浏览器运行时的出错的行号 var a="117|117" 前面的错误是由于有特殊符号“|”,用$("txtId"+a).val();去取 ...
- python中装饰器的原理以及实现,
python版本 3.6 1.python的装饰器说白了就是闭包函数的一种应用场景,在运用的时候我们遵循 #开放封闭原则:对修改封闭,对拓展开放 2.什么是装饰器 #装饰他人的器具,本身可以是任意可调 ...
- Linux系统的性能测试
性能测试:CPU内存,硬盘IO读写,带宽速度,UnixBench 一.CPU物理个数.内核.超线程.多核心 1.登录Terminal,执行:cat /proc/cpuinfo,就会显示出主机的CPU详 ...
- mysql通过binlog恢复数据
如果mysql不小心操作失误导致数据错误或者丢失这时候binlog起到了很大的作用 恢复有几种方式 1.按时间恢复--start-datetime 如果确定了时间点,那么按时间恢复是一个再好不过的 ...
- JAVA IDE IntelliJ IDEA使用简介(三)—之你不能忘记的快捷键
IDEA有许多的快捷键来帮助你更便捷的编写代码,以下列出的快捷键(默认情况下,你还没有定制你的快捷键)是工作中经常需要使用到的,请牢记 快捷键 描述 备注 Alt+F1 视图切换 切换当前工作文件的视 ...
- DELPHI Showmodal 模式窗体
Showmodal 是个函数, Show 是个过程 1. Showmodal: 概念 : 当你调用一个窗口用 SHOWMODAL 时 , 当这个窗口显示出来后 , 程序不会继续自己执行 , 而 ...
- java邮件开发
一.邮件协议: (重点)SMTP:发送邮件的协议.Simple Message Transfer Protocal.默认端口:25 POP:邮局协议(收件协议).Post Office Protoca ...
- Java入门之:基本数据类型
Java基本数据类型 变量就是申请内存来存储值,也就是说,当创建变量的时候,需要在内存中申请空间.内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来存储该类型的数据,如下图所示: 因此, ...