[JZO6401]:Time(贪心+树状数组)
题目描述
小$A$现在有一个长度为$n$的序列$\{x_i\}$,但是小$A$认为这个序列不够优美。
小$A$认为一个序列是优美的,当且仅当存在$k\in [1,n]$,满足:
$$x_1\leqslant x_2\leqslant...\leqslant x_k\geqslant x_{k+1}\geqslant...\geqslant x_n$$
现在小$A$可以进行若干次操作,每次可以交换序列中相邻的两个项,现在他想知道最少操作多少次之后能够使序列变为优美的。
输入格式
第一行一个正整数$n$,表示序列的长度。
接下来一行$n$个整数,表示初始的序列。
输出格式
输出一行一个整数,表示最少需要的操作次数。
样例
样例输入:
5
3 4 5 1 2
样例输出:
1
数据范围与提示
对于$30\%$的数据,$n\leqslant 12$
对于$60\%$的数据,$n\leqslant 100,000$,$a_i$互不相同
对于$100\%$的数据,$n,a_i\leqslant 100,000$
题解
考虑贪心,一定是挨个将最小的数移到两端不劣。
至于过程直接用树状数组维护就好了,交换次数就是一侧比它大的数的个数。
时间复杂度:$\Theta(n\log n)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n;
int a[100001],cnt;
int tr[100001];
long long ans;
vector<int> vec[100001];
int lowbit(int x){return x&-x;}
void add(int x){for(int i=x;i<=n;i+=lowbit(i))tr[i]++;}
void del(int x){for(int i=x;i<=n;i+=lowbit(i))tr[i]--;}
int ask(int x){int res=0;for(int i=x;i;i-=lowbit(i))res+=tr[i];return res;}
int main()
{
scanf("%d",&n);cnt=n;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++){add(i);vec[a[i]].push_back(i);}
for(int i=1;i<=n;i++)
for(int j=0;j<vec[i].size();j++)
{
int x=ask(vec[i][j]-1),y=cnt-x-1;
ans+=min(x,(int)(y-vec[i].size()+j+1));
del(vec[i][j]);cnt--;
}
printf("%lld",ans);
return 0;
}
rp++
[JZO6401]:Time(贪心+树状数组)的更多相关文章
- 【bzoj4240】有趣的家庭菜园 贪心+树状数组
题目描述 对家庭菜园有兴趣的JOI君每年在自家的田地中种植一种叫做IOI草的植物.JOI君的田地沿东西方向被划分为N个区域,由西到东标号为1~N.IOI草一共有N株,每个区域种植着一株.在第i个区域种 ...
- 贪心+树状数组维护一下 Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) D
http://codeforces.com/contest/724/problem/D 题目大意:给你一个串,从串中挑选字符,挑选是有条件的,按照这个条件所挑选出来的字符集合sort一定是最后选择当中 ...
- D 洛谷 P3602 Koishi Loves Segments [贪心 树状数组+堆]
题目描述 Koishi喜欢线段. 她的条线段都能表示成数轴上的某个闭区间.Koishi喜欢在把所有线段都放在数轴上,然后数出某些点被多少线段覆盖了. Flandre看她和线段玩得很起开心,就抛给她一个 ...
- [BZOJ4240]有趣的家庭菜园(贪心+树状数组)
最后数列一定是单峰的,问题就是最小化最后的位置序列的逆序对数. 从大到小加数,每次贪心看放左边和右边哪个产生的逆序对数更少,树状数组即可. 由于大数放哪对小数不产生影响,所以正确性显然. 注意相同数之 ...
- [P4064][JXOI2017]加法(贪心+树状数组+堆)
题目描述 可怜有一个长度为 n 的正整数序列 A,但是她觉得 A 中的数字太小了,这让她很不开心. 于是她选择了 m 个区间 [li, ri] 和两个正整数 a, k.她打算从这 m 个区间里选出恰好 ...
- [luoguP2672] 推销员(贪心 + 树状数组 + 优先队列)
传送门 贪心...蒟蒻证明不会... 每一次找最大的即可,找出一次最大的,数列会分为左右两边,左边用stl优先队列维护,右边用树状数组维护.. (线段树超时了....) 代码 #include < ...
- codeforces 1249 D2 Too Many Segments (hard version) 贪心+树状数组
题意 给定n个线段,线段可以相交,第\(i\)个线段覆盖的区间为\([l_i,r_i]\),问最少删除多少个线段让覆盖每个点的线段数量小于等于k. 分析 从左往右扫每个点\(x\),若覆盖点\(x\) ...
- UVALive 6911---Double Swords(贪心+树状数组(或集合))
题目链接 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- 【HOJ2430】【贪心+树状数组】 Counting the algorithms
As most of the ACMers, wy's next target is algorithms, too. wy is clever, so he can learn most of th ...
随机推荐
- 版本控制器之SVN(一)
通常软件开发由多人协作开发,如果对代码文件.配置文件.文档等没有进行版本控制,将会出现很多问题: 备份多个版本,占用磁盘空间大 解决代码冲突困难 容易引发BUG 难于追溯问题代码的修改人和修改时间 难 ...
- 一、程序安全-SQL注入漏洞
先新建MYDB.MDF,表MyUser: 测试页面: 一.利用报错获取信息 操作:按姓名精确查询,在输入框输入:小卫' and 1=db_name()/0 and '1'='1执行语句:select ...
- 导入excel-uploadify+npoi
总结: 导入文件时一定要给database设置栏位 虚拟表的栏位名称可以与数据库表不一致,但顺序一定要一致,因为它是按照顺序依次插入的 sheet.FirstRowNum = 0; sheet.Fir ...
- Git复习(七)之自定义git、忽略特殊文件、配置文件
前言 config 配置有system级别(系统级别). global(用户级别).local(当前仓库)三个 设置先从system->global->local 底层配置会覆盖顶层配置 ...
- leetcode 1051. Height Checker
Students are asked to stand in non-decreasing order of heights for an annual photo. Return the minim ...
- Django框架——基础之模板系统(template文件夹)
---恢复内容开始--- 1. 常用语法 需要记住两组特殊符号:{{ }} 和 {% %}. 在运用到变量的时候使用{{ }},如果是跟逻辑相关的话就使用{% %}. 在Django模板(t ...
- VMware安装CentOS7_1511 mini版本
这次安装使用的是 CentOS7_1511_mini 如果没有点击下载 点击下载
- 常用的排序算法介绍和在JAVA的实现(一)
一.写随笔的原因:排序比较常用,借此文介绍下排序常用的算法及实现,借此来MARK一下,方便以后的复习.(本人总是忘得比较快) 二.具体的内容: 1.插入排序 插入排序:在前面已经排好序的序列中找到合适 ...
- PIL:处理图像的好模块
介绍 PIL是一个专门用来处理图像的模块,可以对图象进行各种各样的变换 打开一张图片 from PIL import Image # 调用Image下的open方法,即可打开一张图片 # 得到的im便 ...
- On Java 8
On Java 8本书原作者为 [美] Bruce Eckel,即<Java 编程思想>的作者.本书是事实上的 <Java 编程思想>第五版.<Java 编程思想> ...