HDU 6318 - Swaps and Inversions - [离散化+树状数组求逆序数][杭电2018多校赛2]
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=6318
Tonyfang think this sequence is messy, so he will count the number of inversions in this sequence. Because he is angry, you will have to pay x yuan for every inversion in the sequence.
You don't want to pay too much, so you can try to play some tricks before he sees this sequence. You can pay y yuan to swap any two adjacent elements.
What is the minimum amount of money you need to spend?
The definition of inversion in this problem is pair (i,j) which 1≤i<j≤n and ai>aj.
For each test, in the first line, three integers, n,x,y, n represents the length of the sequence.
In the second line, n integers separated by spaces, representing the orginal sequence a.
1≤n,x,y≤100000, numbers in the sequence are in [−1e9,1e9]. There're 10 test cases.
题意:
给出n个元素的序列,现在你有机会,花费y元交换一次任意相邻两个元素,交换完毕后,若存在逆序对,每一个逆序对要花费x元,求最少的花费。
题解:
考虑冒泡排序:
1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。做完一遍,最后的元素是最大的数。
3. 针对所有的元素重复以上的步骤,除了最后一个(因为确定是最大的)。
4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
显然,我们每交换一次两个相邻元素,就必然能使逆序数减1,而排序完毕后逆序数等于0,所以冒泡排序交换相邻元素次数等于逆序数。
而且同样易知,我们不可能用更少的交换次数使得逆序数等于0。
所以我们就得到了如下结论:
逆序数 = 在只能交换相邻元素条件下,使得序列有序的最少交换次数
而本题中,交换一次花费x,一个逆序对花费y,也就是说,要么全部交换直到没有逆序对,要么一次也不交换。
所以我们只要求出逆序数k,答案ans = k * min(x,y)。
由于本题数值范围[-1e9,1e9],而n最多1e5,树状数组不可能开2e9,所以只能进行离散化。
时间复杂度:sort函数O(nlogn),unique函数O(n),暴力枚举n个元素并获取ID以及树状数组修改+查询操作O(nlogn),总的O(nlogn),满足要求。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=+; struct _BIT //单点修改、区间查询
{
int n,C[maxn];
int lowbit(int x){return x&(-x);}
void init(int n)
{
this->n=n;
memset(C,,sizeof(C));
}
void add(int pos,int val) //在pos点加上val
{
while(pos<=n)
{
C[pos]+=val;
pos+=lowbit(pos);
}
}
int ask(int pos) //查询1~pos点的和
{
int ret=;
while(pos>)
{
ret+=C[pos];
pos-=lowbit(pos);
}
return ret;
}
}BIT; int n;
ll x,y; int a[maxn]; vector<int> v;
inline int getID(int x){return lower_bound(v.begin(),v.end(),x)-v.begin()+;}
int main()
{
while(scanf("%d%d%d",&n,&x,&y)!=EOF)
{
v.clear();
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
v.push_back(a[i]);
}
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end()); BIT.init(v.size());
ll cnt=;
for(int i=;i<=n;i++)
{
int id=getID(a[i]);
BIT.add(id,);
cnt+=BIT.ask(v.size())-BIT.ask(id);
} cout<<cnt*min(x,y)<<endl;
}
}
HDU 6318 - Swaps and Inversions - [离散化+树状数组求逆序数][杭电2018多校赛2]的更多相关文章
- SGU180 Inversions(树状数组求逆序数)
题目: 思路:先离散化数据然后树状数组搞一下求逆序数. 离散化的方法:https://blog.csdn.net/gokou_ruri/article/details/7723378 自己对用树状数组 ...
- hdu 1394 Minimum Inversion Number (裸树状数组 求逆序数 && 归并排序求逆序数)
题目链接 题意: 给一个n个数的序列a1, a2, ..., an ,这些数的范围是0-n-1, 可以把前面m个数移动到后面去,形成新序列:a1, a2, ..., an-1, an (where m ...
- 牛客练习赛38 D 题 出题人的手环 (离散化+树状数组求逆序对+前缀和)
链接:https://ac.nowcoder.com/acm/contest/358/D来源:牛客网 出题人的手环 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他 ...
- hdu 5147 Sequence II (树状数组 求逆序数)
题目链接 Sequence II Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- poj 2299 Ultra-QuickSort(树状数组求逆序数)
链接:http://poj.org/problem?id=2299 题意:给出n个数,求将这n个数从小到大排序,求使用快排的需要交换的次数. 分析:由快排的性质很容易发现,只需要求每个数的逆序数累加起 ...
- HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number ...
- poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)
题目链接:http://poj.org/problem?id=2299 Description In this problem, you have to analyze a particular so ...
- Codeforces645B【树状数组求逆序数】
题意: 给你1-n的序列,然后有k次机会的操作,每一次你可以选择两个数交换. 求一个最大的逆序数. 思路: 感觉就是最后一个和第一个交换,然后往中间逼近,到最终的序列,用树状数组求一下逆序数. #in ...
- HDU 1394 Minimum Inversion Number(线段树/树状数组求逆序数)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
随机推荐
- [Scikit-learn] 1.1 Generalized Linear Models - Lasso Regression
Ref: http://blog.csdn.net/daunxx/article/details/51596877 Ref: https://www.youtube.com/watch?v=ipb2M ...
- 如何在 CentOS 7 上安装 Docker
Docker 是一个开源工具,它可以让创建和管理 Linux 容器变得简单.容器就像是轻量级的虚拟机,并且可以以毫秒级的速度来启动或停止.Docker 帮助系统管理员和程序员在容器中开发应用程序,并且 ...
- linq to xml 初学 -- 查询语法
初学linq to xml,很方便 string path = ch.GetConfigFile("")+ "SpeedDial.xml"; var sdDo ...
- SpringMVC由浅入深day01_12.4 pojo绑定_12.5自定义参数绑定实现日期类型绑定_12.6集合类
12.4 pojo绑定 页面中input的name和controller的pojo形参中的属性名称一致,将页面中数据绑定到pojo. 页面定义: controller的pojo形参的定义: 打断点测试 ...
- openvpn记住用户名和密码,自动连接
1, 打开openvpn安装目录 2, 在config目录中, 找到VPN服务器的配置文件, 我的是config.ovpn,将 auth-user-pass (若已经存在)改为 auth-user-p ...
- 【安全开发】IOS安全编码规范
申明:本文非笔者原创,原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%8 ...
- IIS日志清理(VBS版,JS版)
IIS默认日志记录在C:\WINDOWS\system32\LogFiles,时间一长,特别是子站点多的服务器,一个稍微有流量的网站,其日志每天可以达到上百兆,这些文件日积月累会严重的占用服务器磁盘空 ...
- x264编码的图像出现乱码的问题
将YUV进行x264编码的时候,建议将 i_threads 参数设置成 X264_SYNC_LOOKAHEAD_AUTO//* 取空缓冲区继续使用不死锁的保证. 否则有可能编码出来的数据会出现IDR_ ...
- 使用 TXT 文本存储
将爬取的数据以 TXT 文本形式存储: import requests data = requests.get('http://www.baidu.com/').text with open('/tm ...
- windows之IP地址(一)
服务器: 顾名思义,是服务我们上网的机器.结构组成上和普通的PC结构相似,装了服务器版的系统后都可以作为服务器使用,但前者可靠性高.服务器是网络这个网上的中间节点,供每台终端进行访问.数据信息保存,有 ...