题目链接:点击查看

题目大意:给出一个长度为 n 的序列,每次操作可以交换相邻两个数字的位置,现在问最小进行多少次操作,可以使得序列的相对大小呈山峰状(中间高两边低,或非严格递增或非严格递减)

题目分析:简单分析过后不难看出,对于位置 i 的数字来说,最后的位置只会有两种情况,一种是位于上升的山坡上,另一种是位于下降的山坡上,分类讨论一下:

  1. 如果位置 i 最终位于上升的山坡上,那么至少需要与其左边所有大于他的数完成一次交换
  2. 如果位置 i 最终位于下降的山坡上,那么至少需要与其右边所有大于他的数完成一次交换

这样我们只需要对每个数统计一下贡献就好了,看一下是将其放在上升的山坡上还是下降的山坡上更优即可

这样问题就转换为了求某个数前面有多少个比他大的数,经典的逆序对问题,用树状数组或者线段树去解决就好了

代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const LL inf=0x3f3f3f3f3f3f3f3f;const int N=1e5+100;int a[N],c[N];LL pre[N],nt[N];int lowbit(int x)
{return x&(-x);
}void add(int x)
{for(int i=x;i<N;i+=lowbit(i))c[i]++;
}int ask(int x)
{int ans=0;for(int i=x;i>0;i-=lowbit(i))ans+=c[i];return ans;
}void init()
{memset(c,0,sizeof(c));
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",a+i);init();for(int i=1;i<=n;i++){pre[i]=ask(N-1)-ask(a[i]);add(a[i]);}init();for(int i=n;i>=1;i--){nt[i]=ask(N-1)-ask(a[i]);add(a[i]);}LL ans=0;for(int i=1;i<=n;i++)ans+=min(pre[i],nt[i]);printf("%lld\n",ans);return 0;
}

牛客 - What Goes Up Must Come Down(树状数组求逆序对)相关推荐

  1. 牛客练习赛33 D tokitsukaze and Inverse Number (树状数组求逆序对,结论)

    链接:https://ac.nowcoder.com/acm/contest/308/D 来源:牛客网 tokitsukaze and Inverse Number 时间限制:C/C++ 1秒,其他语 ...

  2. 牛客23054 华华开始学信息学 树状数组分块

    题目链接:牛客23054 华华开始学信息学 题目描述 因为上次在月月面前丢人了,所以华华决定开始学信息学.十分钟后,他就开始学树状数组了.这是一道树状数组的入门题: 给定一个长度为N的序列A,所有元素 ...

  3. 牛客小白月赛13-H(单调栈+树状数组)

    题目链接:https://ac.nowcoder.com/acm/contest/549/H 题意:给一个柱状图,包括每个矩阵的宽度和高度,求能组成的最大矩阵的面积. 思路:显然最大矩阵的高一定为n个 ...

  4. 牛客练习赛52 B:Galahad(树状数组维护区间不同元素和(个数))

    [题目] 查询区间和,如果区间元素重复出现则计数一次. [题解] 按区间的右端点建立树状数组,维护区间[1,R]的每个元素的最右位置.按查询区间的右端点排序,依次处理,每次更新当前值的最右位置即可. ...

  5. 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间

    从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...

  6. 【牛客 - 368B】选点(dfs序,LIS 或 dfs序 + 树状数组 + 离散化,树状数组求LIS的方法)

    题干: 有一棵n个节点的二叉树,1为根节点,每个节点有一个值wi.现在要选出尽量多的点. 对于任意一棵子树,都要满足: 如果选了根节点的话,在这棵子树内选的其他的点都要比根节点的值大: 如果在左子树选 ...

  7. 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)

    title: 牛客练习赛34 - C little w and Segment Coverage(思维.树状数组) date: 2018-12-15 16:36:55 tags: [树状数组,思维] ...

  8. 牛客小白9 换个角度思考(离线+树状数组)

    title: 牛客小白9 换个角度思考(离线+树状数组) date: 2018-11-29 15:25:18 tags: [离线,树状数组] categories: ACM 题目链接 题目描述 给定一 ...

  9. 牛客小白月赛12 F 华华开始学信息学 (分块+树状数组)

    链接:https://ac.nowcoder.com/acm/contest/392/F 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他语言65536 ...

最新文章

  1. IT人怎能忘记这些开源?
  2. 时间管理读后记(二)
  3. jQuery的ajaxFileUpload上传文件插件刷新一次才能再次调用触发change
  4. 2345王牌浏览器九宫格个性化设置
  5. Processing编程学习指南1.5 颜色透明度
  6. Windows Server 2012中的DirectAccess部署
  7. php去掉指定字符串,php如何删除字符串中的指定字符串
  8. Excel 单元格自定义下拉菜单
  9. 从“H1N1病毒”看危机意识的重要性
  10. ESP32创建局域网服务器VScode
  11. 聚币网API使用教程 demo
  12. 去年做路由器的那帮兄弟都去哪儿了?
  13. 京东图书架构设计有感
  14. rip/eip/rbp/ebp
  15. 职业价值评估:用一张表格说明一切
  16. 安卓中的BP、AP、NV是什么意思?
  17. android所有需要的Demo地址
  18. 计算机图形学专业 国内大学排名,虚拟现实应用技术专业大学排名 2021全国排行榜...
  19. SQL Server 2008数据库的配置及连接
  20. Open-Falcon 安装

热门文章

  1. python的flask实现接口_Flask快速实现简单python接口
  2. 5 怎么上下分屏_oppo的最新手机reno5系列怎么样
  3. dns服务器正则表达式验证,js如何对域名和ip进行校验?(正则表达式)
  4. 怎么写脚本_直播脚本怎么写|请收下这份攻略
  5. 鸿蒙股票深度分析,本月华为鸿蒙概念股市回顾分析(3月31日)
  6. java树形菜单_Java构建树形菜单
  7. c语言5个学生3门成绩写入文件,(5) 输入N个学生的姓名和3门课的成绩,统计每个学生的平均成绩后,将结果输出到文件studen...
  8. MySQL语法规范介绍
  9. MyBatis 缓存详解-二级缓存介绍
  10. 工厂模式解耦的升级版