What Goes Up Must Come Down(思维+逆序对构造LIS山峰)
https://ac.nowcoder.com/acm/contest/7831/F
考虑题意:对于每一个数来说,它最终要不左边的数全比它小,要不右边的数全比他小。
交换相邻的两个数,其他数字的相对位置不变。
那么转换一下思维,最终换的次数就是某个数被其他数交换的次数,然后累加每个数。
某个数要和其他数交换的次数,就是逆序对的个数。
比如3 3 3 0 1 3.这个1要换的次数要不是右边的1个3,要不是左边的3个3.中间过来的次数是交给0 的。
每次移动相邻两个位置,所以你只需要判断它左边比它大的数的个数和右边比它大的个数的最小值。
然后选小的那个交换。
求逆序对用树状数组即可。注意作桶的时候最大值开大。
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
#define lowbit(x) x&(-x);
using namespace std;
const int maxn=1e5+100;
typedef long long LL;
const LL inf=1e5+5;
LL a[maxn],tree1[maxn],c[maxn],n;
void add(LL x,LL d)
{while(x<=inf){///桶要开大 tree1[x]+=d;x+=lowbit(x);}
}
LL getsum(LL x)
{LL sum=0;while(x>0){sum+=tree1[x];x-=lowbit(x); }return sum;
}
int main(void)
{cin.tie(0);std::ios::sync_with_stdio(false);cin>>n;for(LL i=1;i<=n;i++) cin>>a[i];LL ans=0;memset(tree1,0,sizeof(tree1));for(LL i=1;i<=n;i++){add(a[i],1);c[i]=i-getsum(a[i]);}memset(tree1,0,sizeof(tree1));for(LL i=n;i>=1;i--){add(a[i],1);c[i]=min(c[i],n-i+1-getsum(a[i]));}for(LL i=1;i<=n;i++) ans+=c[i];cout<<ans<<endl;
return 0;
}
What Goes Up Must Come Down(思维+逆序对构造LIS山峰)相关推荐
- E. String Reversal(思维+逆序对)详解
https://codeforces.com/contest/1430/problem/E 题意:交换相邻的字母使得字符串翻转的最小次数. 最近碰到了几道逆序对的题,有个比较明显的特征是交换相邻的数. ...
- 108. 奇数码问题【思维 / 逆序对】
n为奇数,左右交换不改变逆序对数个数,上下交换不改变逆序对奇偶性. 结论就是,将其转化成1维,将0去除掉,求逆序对的数量,看这两个的逆序对的奇偶性是否相同即可. #include<bits/st ...
- Codeforces Round #598 (Div. 3) F. Equalizing Two Strings 思维 + 逆序对
传送门 文章目录 题意: 思路: 题意: 给你两个长度为nnn的串a,ba,ba,b,每次可以同时翻转a,ba,ba,b中任意一段长度为L(1≤L≤n)L(1\le L\le n)L(1≤L≤n)的子 ...
- Codeforces987 E. Petr and Permutations(思维+逆序对)
题意: 一开始有一个长度为n的原排列a, 一次操作随机选择两个不同位置的数a(i)和a(j),然后交换. Petr会进行3n次操作,Alex会进行7n+1次操作. 现在给出结果序列,要求判断结果序列是 ...
- 期望dp ---- B. Tree Array 思维+期望dp 逆序对期望数
题目大意 题目大意: n(n≤200)n(n\leq200)n(n≤200)个节点的树.初始的时候,等概率随机选择一个点标记,接来随机选择一个与标记点相连的未标记点来标记,直到所有的点都被标记.根据点 ...
- 左神小和问题逆序对问题面试
归并排序的扩展问题 --先了解数据结构之归并排序,更容易理解以下的问题. 小和问题和逆序对问题. 在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和.在一个数组中,左边的数如果比右边 ...
- 1164: 分治 逆序对
1164: 分治 逆序对 时间限制: 1 Sec 内存限制: 128 MB 题目描述 给一列数a1,a2,...,an,求它的逆序对数,即有多少个有序对(i,j),使得i<j且ai>aj ...
- 【2018.12.15】【考试总结】【模拟+逆序对+树状数组+贪心+multiset】爆零之旅
这是我悲惨的接近爆零的一次考试,但是本蒟蒻不能放弃,还是要总结的QAQ 答题卡 [题目背景] 八月是个悲惨的月份.先不谈炎热的天气,对于新生来说,八月意味着军训: 而对于高二高三的同学来说,八月意味着 ...
- 【逆序对】Ultra - Quicksort
POJ 2299 Ultra-QuickSort 只允许交换,比较相邻的元素, 求最少多少次交换可以使得序列有序 冒泡排序的次数-->数列中逆序对的个数减1-->最终为0 -->答案 ...
最新文章
- python项目归纳总结-python商城项目总结
- java 页面错误转发提示页面 errorPage转跳报HTTP500内部服务器错误
- polkit 重新安装_不折腾,为U-NAS安装一个清爽的桌面,把小U打造成双面高手
- oracle数据库用脚本运行SQL语句
- poj 2182 Lost Cows 解题报告
- c 语言 小波变换,小波变换C语言
- 【论文解读】Cross-dataset Training for Class Increasing Object Detection
- 297 - Quadtrees
- ftp上传乱码_ftp同步图片到本地文件夹,ftp同步图片到本地文件夹的实现步骤
- 如何解决This system is not registered with RHN.
- Sandwell模型和卫星测高反演海底地形
- Vue前端页面关键词快速搜索方法
- 6月13日木叶下向量
- 解决bug--解决VS2019“无法下载安装文件,请检查网络设置”问题
- 常见前端面试题之盒子模型
- 怎么旋转DIV 45度 要以中心旋转
- 为什么用红墨水试验检测BGA焊接情况?我教你如何对结果预判!
- 交易系统五:海龟交易法
- tensorflow标签向量化
- Java后端面经-----MySQL面试中常见问题总结