题意:给你一个n, 接来下给你一个 [1,n] 中偶数的排列, 还有一个 [1, n] 中 奇数 按照递增的顺序排列, 现在求一个原数列, 使得偶数列排序 和 奇数列 都是原数列的一个子序列, 现在求原数列的最小的逆序对是多少。

题解:

昨天一直想的是把偶数列往奇数列里面插入, 又想到这个东西有一定的单调性, 但是不好处理。

现在我们转换思路, 将奇数列往偶数列中插入, 对于这种写法来说, 你递增的 2i+1 的最优位置一定也是递增的。

假设我们现在知道了 2k+1 对于每一个插入位置产生的逆序对是多少, 那么当我们处理到 2(k+1) + 1 的数的时候,我们可以发现,所有在 2(k+1) 这个数的位置前面的所有可以插入数的位置他们的逆序对数都会+1,所有在 2*(k+1) 的位置后面的所有的可插入的数的位置会产生的逆序对数都会 -1。

所以当我们从1 -> n 处理奇数的时候 每次处理完一个奇数 2*i + 1之后都会在 [1,  pos(2*(i+1)) ] 这一段的位置产生的逆序对数 + 1, [pos(2*(i+1)) + 1, end] 这一段位置的产生的逆序对数 -1 。

这样就说明了最优位置也是随着 i 增大而增大的。

代码:

 #include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL mod = (int)1e9+;
const int N = 2e5 + ;
int n;
int c[N], b[N], tree[N];
int lazy[N<<], mn[N<<];
map<int,int> mp;
void add(int x, int c){
while(x <= n){
tree[x] += c;
x += x&(-x);
}
}
int query(int x){
int ret = ;
while(x){
ret += tree[x];
x -= x&(-x);
}
return ret;
}
inline void Push_Up(int x){
mn[x] = min(mn[x<<|], mn[x<<]);
}
inline void Push_Down(int x){
if(lazy[x]){
mn[x<<] += lazy[x];
mn[x<<|] += lazy[x];
lazy[x<<] += lazy[x];
lazy[x<<|] += lazy[x];
lazy[x] = ;
}
}
void Update(int l, int r, int rt, int L, int R, int c){
if(L <= l && r <= R){
lazy[rt] += c;
mn[rt] += c;
return ;
}
int m = l + r >> ;
Push_Down(rt);
if(L <= m) Update(lson, L, R, c);
if(m < R) Update(rson, L, R, c);
Push_Up(rt);
}
void build(int l, int r, int rt){
lazy[rt] = ;
if(l == r){
mn[rt] = c[l];
return;
}
int m = l+r >> ;
build(lson);
build(rson);
Push_Up(rt);
}
int main(){
scanf("%d", &n);
int m = n/;
LL ans = ;
for(int i = ; i <= m; i++){
scanf("%d", &b[i]);
mp[b[i]] = i;
add(b[i], );
ans += i - query(b[i]);
}
int t = m + ;
for(int i = ; i <= t; i++)
c[i] = i - ;
build(, t, );
for(int i = ; i <= n; i += ){
int p = mp[i-];
Update(, t, , , p, );
Update(, t, , p+, t, -);
ans += mn[];
}
printf("%lld\n", ans);
return ;
}

牛客暑假多校第五场 D inv的更多相关文章

  1. 牛客暑假多校第五场A.gpa

    一.题意 给出你的N门课程的考试成绩和所占的机电数目.允许你放弃K门课的成绩,要求你的平均学分绩最高能达到多少. Kanade selected n courses in the university ...

  2. 牛客暑假多校第五场 I vcd

    这个题目一个队友没读懂, 然后我读错了题目, 还让他堆了半天的公式写了半天的代码, 交上去一直0.0, 另一队友问题目有没有读错, 我坚持没有读错, 然后坑了2个小时的时间,不然应该会早一点做出来. ...

  3. 牛客2018多校第五场E-room 最小费用最大流

    题意:有n个寝室,每个寝室4个人,现在在搞搬寝室的活动,告诉你每个寝室之前的人员名单,和之后的人员名单,问最少需要几个人要搬寝室. 思路: 转化为最小费用最大流解决的二分图问题,对每个去年的宿舍,向每 ...

  4. 牛客暑假多校第六场I-Team Rocket

    一.题意 我们是穿越银河的火箭队....... 给出若干个区间,之后给出若干个点,要求对每个点求出,第一个覆盖点的区间的数量,之后用当前所有点覆盖的区间的序号的乘积结合输入的Y来生成下一位点.最后输出 ...

  5. 牛客暑假多校第六场 I Team Rocket

    题意: 现在有n条火车, 每条火车都有一个运行 [ Li, Ri ], 现在有m支火箭队, 每次火箭队都会破坏这整条铁路上的一个点, 如果一条火车的运行区间[Li, Ri] 被破坏了, 那么这条火车会 ...

  6. 2019牛客暑期多校第五场题解ABGH

    A.digits 2 传送门 题意:给你一个n,要求输出一个每一位数字之和能整除n且其本身也能整除n的数.n不超过100,要求的数不超过10000位数. 题解:直接将n输出n次. 代码: #inclu ...

  7. 2020牛客暑假多校训练营 第二场 H Happy Triangle set 线段树 分类讨论

    LINK:Happy Triangle 这道题很容易. 容易想到 a+b<x a<x<b x<a<b 其中等于的情况在第一个和第三个之中判一下即可. 前面两个容易想到se ...

  8. 2020牛客暑假多校训练营 第二场 G Greater and Greater bitset

    LINK:Greater and Greater 确实没能想到做法. 考虑利用bitset解决问题. 做法是:逐位判断每一位是否合法 第一位 就是 bitset上所有大于\(b_1\)的位置 置为1. ...

  9. 2020牛客暑假多校训练营 第二场 E Exclusive OR FWT

    LINK:Exclusive OR 没做出 原因前面几篇说过了. 根据线性基的知识容易推出 不超过\(w=log Mx\)个数字即可拼出最大值 其中Mx为值域. 那么考虑w+2个数字显然也为最大值.. ...

随机推荐

  1. java中dao层和service层的区别是什么

    dao层中已经有操作数据库的方法了,为什么还要service层去封装?有什么好处? tanghui12321 | 浏览 131990 次  我有更好的答案  推荐于2017-10-06 18:44:5 ...

  2. React Hooks 深入系列 —— 设计模式

    本文是 React Hooks 深入系列的后续.此篇详细介绍了 Hooks 相对 class 的优势所在, 并介绍了相关 api 的设计思想, 同时对 Hooks 如何对齐 class 的生命周期钩子 ...

  3. js数组排序 多条件

    按照[次数]和[时间]排序,选择次数最多的排在前面,同样次数的情况下时间较新排在前面. 原始数据: var arr= [ {name:'qqq', num:2,time:'2015-06-08 13: ...

  4. Spark Streaming消费Kafka Direct保存offset到Redis,实现数据零丢失和exactly once

    一.概述 上次写这篇文章文章的时候,Spark还是1.x,kafka还是0.8x版本,转眼间spark到了2.x,kafka也到了2.x,存储offset的方式也发生了改变,笔者根据上篇文章和网上文章 ...

  5. Windows 纠错

    4:在Windows应用程序中,当需要将窗体显示为模式对话框时,需要调用窗体的()方法.(选择一项)A:Activate()B:ShowDialog()C:Show()D:Close()正确答案是 B ...

  6. WebService—— IDEA创建WebServices

    一.File–>New–>Project 弹出这个对话框后,照下图的勾选然后点击Next,然后填写项目名和项目路径后,点击finish. 二.生成目录如下 需要注意的有HelloWorld ...

  7. Windows下的bat原来可以为我们做很多

    用了windows系统这么多年了,对bat也不是很了解.最近研究了一下bat的用法.这里就大概列举一下自己的用法 参考网址 基本命令 echo echo我们可以理解成程序中的输出,和我们Java的Sy ...

  8. Spring项目集成ShiroFilter简单实现权限管理

    Shiros是我们开发中常用的用来实现权限控制的一种工具包,它主要有认证.授权.加密.会话管理.与Web集成.缓存等功能.我是从事javaweb工作的,我就经常遇到需要实现权限控制的项目,之前我们都是 ...

  9. Android lifecycle 实战及使用进阶

    版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/gdutxiaoxu/article/det ...

  10. 重学计算机网络(二) - 曾记否,查IP地址

    先献上几个梗 1.1.1.1 不是测试用的,原来一直没分配,现在被用来做一个DNS了,宣传是比谷歌等公司的dns服务 更保护用户隐私. IP地址255.255.255.255,代表有限广播,它的目标是 ...