牛客 - What Goes Up Must Come Down(树状数组求逆序对)
题目链接:点击查看
题目大意:给出一个长度为 n 的序列,每次操作可以交换相邻两个数字的位置,现在问最小进行多少次操作,可以使得序列的相对大小呈山峰状(中间高两边低,或非严格递增或非严格递减)
题目分析:简单分析过后不难看出,对于位置 i 的数字来说,最后的位置只会有两种情况,一种是位于上升的山坡上,另一种是位于下降的山坡上,分类讨论一下:
- 如果位置 i 最终位于上升的山坡上,那么至少需要与其左边所有大于他的数完成一次交换
- 如果位置 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(树状数组求逆序对)相关推荐
- 牛客练习赛33 D tokitsukaze and Inverse Number (树状数组求逆序对,结论)
链接:https://ac.nowcoder.com/acm/contest/308/D 来源:牛客网 tokitsukaze and Inverse Number 时间限制:C/C++ 1秒,其他语 ...
- 牛客23054 华华开始学信息学 树状数组分块
题目链接:牛客23054 华华开始学信息学 题目描述 因为上次在月月面前丢人了,所以华华决定开始学信息学.十分钟后,他就开始学树状数组了.这是一道树状数组的入门题: 给定一个长度为N的序列A,所有元素 ...
- 牛客小白月赛13-H(单调栈+树状数组)
题目链接:https://ac.nowcoder.com/acm/contest/549/H 题意:给一个柱状图,包括每个矩阵的宽度和高度,求能组成的最大矩阵的面积. 思路:显然最大矩阵的高一定为n个 ...
- 牛客练习赛52 B:Galahad(树状数组维护区间不同元素和(个数))
[题目] 查询区间和,如果区间元素重复出现则计数一次. [题解] 按区间的右端点建立树状数组,维护区间[1,R]的每个元素的最右位置.按查询区间的右端点排序,依次处理,每次更新当前值的最右位置即可. ...
- 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间
从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...
- 【牛客 - 368B】选点(dfs序,LIS 或 dfs序 + 树状数组 + 离散化,树状数组求LIS的方法)
题干: 有一棵n个节点的二叉树,1为根节点,每个节点有一个值wi.现在要选出尽量多的点. 对于任意一棵子树,都要满足: 如果选了根节点的话,在这棵子树内选的其他的点都要比根节点的值大: 如果在左子树选 ...
- 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)
title: 牛客练习赛34 - C little w and Segment Coverage(思维.树状数组) date: 2018-12-15 16:36:55 tags: [树状数组,思维] ...
- 牛客小白9 换个角度思考(离线+树状数组)
title: 牛客小白9 换个角度思考(离线+树状数组) date: 2018-11-29 15:25:18 tags: [离线,树状数组] categories: ACM 题目链接 题目描述 给定一 ...
- 牛客小白月赛12 F 华华开始学信息学 (分块+树状数组)
链接:https://ac.nowcoder.com/acm/contest/392/F 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他语言65536 ...
最新文章
- IT人怎能忘记这些开源?
- 时间管理读后记(二)
- jQuery的ajaxFileUpload上传文件插件刷新一次才能再次调用触发change
- 2345王牌浏览器九宫格个性化设置
- Processing编程学习指南1.5 颜色透明度
- Windows Server 2012中的DirectAccess部署
- php去掉指定字符串,php如何删除字符串中的指定字符串
- Excel 单元格自定义下拉菜单
- 从“H1N1病毒”看危机意识的重要性
- ESP32创建局域网服务器VScode
- 聚币网API使用教程 demo
- 去年做路由器的那帮兄弟都去哪儿了?
- 京东图书架构设计有感
- rip/eip/rbp/ebp
- 职业价值评估:用一张表格说明一切
- 安卓中的BP、AP、NV是什么意思?
- android所有需要的Demo地址
- 计算机图形学专业 国内大学排名,虚拟现实应用技术专业大学排名 2021全国排行榜...
- SQL Server 2008数据库的配置及连接
- Open-Falcon 安装
热门文章
- python的flask实现接口_Flask快速实现简单python接口
- 5 怎么上下分屏_oppo的最新手机reno5系列怎么样
- dns服务器正则表达式验证,js如何对域名和ip进行校验?(正则表达式)
- 怎么写脚本_直播脚本怎么写|请收下这份攻略
- 鸿蒙股票深度分析,本月华为鸿蒙概念股市回顾分析(3月31日)
- java树形菜单_Java构建树形菜单
- c语言5个学生3门成绩写入文件,(5) 输入N个学生的姓名和3门课的成绩,统计每个学生的平均成绩后,将结果输出到文件studen...
- MySQL语法规范介绍
- MyBatis 缓存详解-二级缓存介绍
- 工厂模式解耦的升级版