Gym - 102082G What Goes Up Must Come Down (树状数组+贪心)
题意:有一个长度为n的序列,你每次可以选择两个相邻的元素交换,求把这个序列排成单峰序列的最少交换次数。
方法一:将元素按数值从大到小排序(保存原来的位置),把最大的插在中间,剩下的依次往两边放,依次考虑每个数该放在左边还是右边,只考虑后加入的数对已有的数的贡献。由于前面加入的数的次序对后加入的数无影响,因此贪心地选择贡献小的一边就行了。贡献为重排后下标的逆序数,注意大小相同的要特殊处理一下就行了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+;
struct D {
int x,y;
bool operator<(const D& b)const {return x>b.x;}
} a[N];
int c[N],n;
int lb(int x) {return x&-x;}
void add(int u,int x) {for(; u<N; u+=lb(u))c[u]+=x;}
int get(int u) {int ret=; for(; u; u-=lb(u))ret+=c[u]; return ret;}
int main() {
scanf("%d",&n);
for(int i=; i<n; ++i)scanf("%d",&a[i].x),a[i].y=i+;
sort(a,a+n);
ll ans=;
for(int i=,j,k; i<n; i=j) {
for(j=i; j<n&&a[j].x==a[i].x; ++j);
for(k=i; k<j; ++k) {
int t=get(a[k].y);
ans+=min(t,i-t);
}
for(k=i; k<j; ++k)add(a[k].y,);
}
printf("%lld\n",ans);
return ;
}
方法二:通过观察可以发现:
1.把一个元素通过相邻交换的方式移动到其他地方,其他元素的相对位置不变
2.对于单峰序列,比某个元素大的数必定都在该元素的同侧
因此,对于每个元素而言,要么把它左边比它大的元素都移到右边去,要么把它右边比它大的元素都移到左边来,因此每个元素对答案的贡献为min(左边比它大的元素数,右边比它大的元素数),树状数组左右各扫一遍就行了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+;
int L[N],R[N],c[N],n,a[N];
int lb(int x) {return x&-x;}
void add(int u,int x) {for(; u<N; u+=lb(u))c[u]+=x;}
int get(int u) {int ret=; for(; u; u-=lb(u))ret+=c[u]; return ret;}
int main() {
scanf("%d",&n);
for(int i=; i<n; ++i)scanf("%d",&a[i]);
for(int i=; i<n; ++i)L[i]=i-get(a[i]),add(a[i],);
memset(c,,sizeof c);
for(int i=n-; i>=; --i)R[i]=n--i-get(a[i]),add(a[i],);
ll ans=;
for(int i=; i<n; ++i)ans+=min(L[i],R[i]);
printf("%lld\n",ans);
return ;
}
Gym - 102082G What Goes Up Must Come Down (树状数组+贪心)的更多相关文章
- Codeforces Gym 100114 H. Milestones 离线树状数组
H. Milestones Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descripti ...
- Gym 101908C - Pizza Cutter - [树状数组]
题目链接:https://codeforces.com/gym/101908/problem/C 题意: 一块正方形披萨,有 $H$ 刀是横切的,$V$ 刀是竖切的,不存在大于等于三条直线交于一点.求 ...
- Codeforces Gym 100269F Flight Boarding Optimization 树状数组维护dp
Flight Boarding Optimization 题目连接: http://codeforces.com/gym/100269/attachments Description Peter is ...
- gym 102082G BZOJ4240 贪心+树状数组
4240: 有趣的家庭菜园 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 756 Solved: 349[Submit][Status][Discu ...
- Gym 100463A Crossings (树状数组 逆序对)
Crossings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100463 Description ...
- Gym 100960G (set+树状数组)
Problem Youngling Tournament 题目大意 给一个序列a[i],每次操作可以更改一个数,每次询问 将序列排序后有多少个数a[i]>=sum[i-1]. n<=10^ ...
- Gym - 101350F Monkeying Around(线段树+树状数组)
When the monkey professor leaves his class for a short time, all the monkeys go bananas. N monkeys a ...
- Gym - 101755G Underpalindromity (树状数组)
Let us call underpalindromity of array b of length k the minimal number of times one need to increme ...
- Gym - 100269F Flight Boarding Optimization(dp+树状数组)
原题链接 题意: 现在有n个人,s个位置和你可以划分长k个区域你可以把s个位置划分成k个区域,这样每个人坐下你的代价是该区域内,在你之前比你小的人的数量问你怎么划分这s个位置(当然,每个区域必须是连续 ...
随机推荐
- HNU_团队项目_需求分析感想(全员)
以下为软件1701-“洋芋好想飞”的需求分析感想 PM QXS 需求分析过程中的前进与曲折令我深刻地认识到,需求分析是一个动态的过程,而非一个静态的任务结点. 比如最初我们设想可以为用户设定角色,但最 ...
- 关于组播数据包“发不出去",c#无法接收
问题一:发不出去 最近做一个小东西改进方案需要用到组播,简单来说就是我先作为服务器端组播发送设备编号,然后组播成员作为客户端接收消息后先确认对方是不是在呼叫我.是的话就返回一个消息,这样我服务器端就可 ...
- C学习笔记-gcc
GNU CC(通常称为GCC)是GNU项目的编译器,它能够编译C.C++语言编写的程序 gcc的优点 使用gcc,程序员可以控制生成二进制执行文件中调试代码的数量和类型. 和其他编译器一样,gcc也可 ...
- Javascript原型、构造函数、实例的关系
1. 原型.构造函数.实例的关系 原型: 原型通过constructor指向构造函数,原型如果是自定义对象且没有明确将constructor指向构造函数,则原型的constructor指向函数的基类F ...
- 使用CompletableFuture进行异步任务编排
1.JDK5引入了Future进行异步任务的处理,Future 的接口主要方法有以下几个: (1)boolean cancel (boolean mayInterruptIfRunning) 取消任务 ...
- JCC指令
0.JMP1.JE, JZ 结果为零则跳转(相等时跳转) ZF=12.JNE, JNZ 结果不为零则跳转(不相等时跳转) ZF=03.JS 结果为负则跳转 SF=14.JNS 结果为非负则 ...
- HanLP-分类模块的分词器介绍
最近发现一个很勤快的大神在分享他的一些实操经验,看了一些他自己关于hanlp方面的文章,写的挺好的!转载过来分享给大家!以下为分享原文(无意义的内容已经做了删除) 如下图所示,HanLP的分类模块中单 ...
- gz文件的压缩和解压
gz文件的压缩和解压 压缩: gzip filename 解压: gunzip filename.gz
- 解决ubuntu命令行中文乱码
解决方法: 1.安装zhcon 登入用户后,输入 1 sudo apt-get install zhcon 2.启动zhcon 输入 1 zhcon --utf8 PS:zhcon支持中文输入法,按 ...
- failed to push some refs to 'git@github.com:cq1415583094/MyBatis.git'解决办法
将本地git仓库代码提交到GitHub上时,出现failed to push some refs to 'git@github.com:cq1415583094/MyBatis.git', 导致的原因 ...