博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 6318 - Swaps and Inversions [2018杭电多校联赛第二场 J](离散化+逆序对)
阅读量:4364 次
发布时间:2019-06-07

本文共 724 字,大约阅读时间需要 2 分钟。

题目链接

【题意】

’给你一个长度为n的序列,序列中每存在一个逆序对就会产生x的代价,你也可以交换序列中相邻的元素来消除一些逆序对,交换一次的代价为y,求怎样操作使得序列最终产生的代价最小

【输入格式】

多组输入,第一行为n,x,y(n,x,y<1e5)代表序列长度和两种不同的代价,第二行为n个整数,每个整数的范围是[-1e9,+1e9],代表序列中的每个值。

【输出格式】

对每组数据输出最小代价是多少

【思路】

对于任意一个序列,交换多少次相邻元素就会消除多少对原有的逆序对,所以只要计算出逆序对的个数再乘以min{x,y}即可,求逆序对可以用归并排序或树状数组,但要在之前对数据离散化一下。

#include
using namespace std;typedef long long ll;const int maxn=100050;ll n,x,y;ll a[maxn],c[maxn];ll bit[maxn];void add(int i,ll x){ while(i<=n){ bit[i]+=x; i+=i&-i; }}ll sum(int i){ ll s=0; while(i>0){ s+=bit[i]; i-=i&-i; } return s;}int main(){ while(scanf("%lld%lld%lld",&n,&x,&y)==3){ for(int i=0;i

转载于:https://www.cnblogs.com/wafish/p/10465278.html

你可能感兴趣的文章
莫比乌斯反演
查看>>
【BZOJ】【1041】【HAOI2008】圆周上的点
查看>>
高并发常见面试题
查看>>
java面向对象中的抽象,类与对象
查看>>
Git学习笔记
查看>>
《Java技术》第二次作业计科1501赵健宇
查看>>
判断线段和直线相交 POJ 3304
查看>>
下拉菜单
查看>>
.net中调用exchange服务器发邮件
查看>>
nginx知识问答
查看>>
JS - 跳转页面
查看>>
显示消息提示对话框(WebForm)
查看>>
分享下自己编译 XBMC 的过程(zhuan)
查看>>
selenium3 + python - cookie定位
查看>>
通过百度地图API获取地址经纬度
查看>>
Map接口
查看>>
【NIO】之IO和NIO的区别
查看>>
for+next()实现数组的遍历及while list each 的使用
查看>>
MySQL中查询获取每个班级成绩前三名的学生信息
查看>>
ubuntu下如何查找某个文件的路径
查看>>