链接:https://www.nowcoder.com/acm/contest/143/D
来源:牛客网

题目描述

Kanade has an even number n and a permutation b of all of the even numbers in [1,n]
Let a denote an array [1,3,5....n-1] , now you need to find a permutation of [1,n] satisfy both a and b are subsequence of it and minimize the number of inverse pair of it.

输入描述:

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

输入

复制

6
2 6 4

输出

复制

2

说明

[1,2,3,5,6,4]

备注:

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的更多相关文章

  1. 牛客多校第五场 F take

    链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 题目描述 Kanade has n boxes , the i-th box has p[i] ...

  2. 牛客多校第五场 J:Plan

    链接:https://www.nowcoder.com/acm/contest/143/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  3. 牛客多校第五场 F take 期望转化成单独事件概率(模板) 树状数组

    链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 Kanade has n boxes , the i-th box has p[i] proba ...

  4. 牛客多校第五场 E room 二分图匹配 KM算法模板

    链接:https://www.nowcoder.com/acm/contest/143/E来源:牛客网 Nowcoder University has 4n students and n dormit ...

  5. 字符串dp——牛客多校第五场G

    比赛的时候脑瘫了没想出来..打多校以来最自闭的一场 显然从s中选择大于m个数组成的数必然比t大,所以只要dp求出从s中选择m个数大于t的方案数 官方题解是反着往前推,想了下反着推的确简单,因为高位的数 ...

  6. 【魔改】树状数组 牛客多校第五场I vcd 几何+阅读理解

    https://www.nowcoder.com/acm/contest/143/I vc-dimension 题解:分三种情况,组合数学算一下,其中一种要用树状数组维护 技巧(来自UESTC):1. ...

  7. 2018牛客多校第五场 H.subseq

    题意: 给出a数组的排列.求出字典序第k小的b数组的排列,满足1<=bi<=n,bi<bi+1,a[b[i]]<a[b[i+1]],m>0. 题解: 用树状数组倒着求出以 ...

  8. 2018牛客多校第五场 E.room

    题意: 一共有n个宿舍,每个宿舍有4个人.给出第一年的人员分布和第二年的人员分布,问至少有多少人需要移动. 题解: 对于第一年的每个宿舍,向今年的每种组合连边.流量为1,费用为(4 - 组合中已在该宿 ...

  9. generator 1(2019年牛客多校第五场B题+十进制矩阵快速幂)

    目录 题目链接 思路 代码 题目链接 传送门 思路 十进制矩阵快速幂. 代码 #include <set> #include <map> #include <deque& ...

随机推荐

  1. Python3 小工具-ARP扫描

    from scapy.all import * import optparse import threading import os def scan(ipt): pkt=Ether(dst='ff: ...

  2. Line belt(三分镶嵌)

    In a two-dimensional plane there are two line belts, there are two segments AB and CD, lxhgww's spee ...

  3. BluetoothServerSocket详解

    一. BluetoorhServerSocket简介 1. 继承关系 public final class BluetoothServerSocket extends Object implement ...

  4. Swift-重写(Override)

    子类可以为继承来的实例方法(instance method),类方法(class method),实例属性(instance property),或附属脚本(subscript)提供自己定制的实现(i ...

  5. C语言100例02 PHP版(练习)

    问题: 企业发放的奖金根据利润提成. 利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%: 20万到 ...

  6. python json 序列化

    如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过 ...

  7. MyBatis原理系列

    原理分析之一:从JDBC到Mybatis 原理分析之二:框架整体设计 原理分析之三:初始化(配置文件读取和解析) 原理分析之四:一次SQL查询的源码分析

  8. C# 代码操作XML(增、删、改)

    目录:  1.创建XML 1)创建普通XML 2)创建带属性的XML 2.追加XML 3.读取XML 1)读取普通XML 2)读取带属性的XML 4.修改属性的值 5.删除XML节点 作为一个小型的数 ...

  9. [洛谷P3261][JLOI2015]城池攻占

    题目大意:有$n$个点的树,第$i$个节点有一个权值$h_i$,$m$个骑士,第$i$个骑士攻击力为$v_i$,一个骑士可以把从它开始的连续的父亲中比它小的节点攻破,攻破一个节点可以把攻击力加或乘一个 ...

  10. [NOIP2012 TG D2T1]同余方程

    题目大意:求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 题解:即求a在mod b意义下的逆元,这里用扩展欧几里得来解决 C++ Code: #include<cstdio ...