逆序对 -- cogs1438 火柴排队
题目链接:http://cogs.pro:8081/cogs/problem/problem.php?pid=vimiQkqjU
【题目描述】
样例一输入:
4
2 3 1 4
3 2 1 4
样例二输入:
4
1 3 4 2
1 7 2 4
思路:对于两盒火柴,最小距离∑(1≤i≤n)(ai - bi)2 可推出只与ai*bi有关,又可知顺序的值大于等于乱序的值,因此只需要将A与B的顺序做成一样的即可,第一想法是考虑升序 或者降序,但是要求交换次数最小,则可取其中一个不动,另外一个的相对顺序变成一样的即可,代码中a[i]表示b的位置,i表示a的第i个元素,则只需要把a进行逆序对统计即可。
代码如下:
#include "iostream"
#include "cstdio"
#include "algorithm"
#define maxn 100100
#define ll long long
using namespace std; struct stick
{
int length, id;
bool operator < (const stick& a)const
{
return length < a.length;
}
}s[maxn], d[maxn]; ll temp[maxn], n, a[maxn];
ll sum = ; void merge(ll b[], ll l, ll r)
{
for (int i = l; i <= r; i++)
{
temp[i] = b[i];
}
int mid = (l + r) >> ;
int i = l, j = mid + ;
for (int pos = l; pos <= r; pos++)
{
if (i == mid + )
{
a[pos] = temp[j];
j++;
}
else if (j == r + )
{
a[pos] = temp[i];
i++;
}
else if (temp[i] > temp[j])
{
a[pos] = temp[j];
j++;
sum += mid - i + ;
sum %= ;
}
else
{
a[pos] = temp[i];
i++;
}
}
} void msort(ll b[], ll l, ll r)
{
if (l == r)
return;
int mid = (l + r) >> ;
msort(b, l, mid);
msort(b, mid + , r);
merge(b, l, r);
} int main()
{
freopen("MatchNOIP2013.in", "r", stdin);
freopen("MatchNOIP2013.out", "w", stdout);
cin >> n;
for (int i = ; i < n; i++)
{
cin >> s[i].length;
s[i].id = i;
}
for (int i = ; i < n; i++)
{
cin >> d[i].length;
d[i].id = i;
}
sort(s, s + n);
sort(d, d + n);//排序后方便将id离散化
for (int i = ; i < n; i++)
{
a[s[i].id] = d[i].id;
}
msort(a, , n - );
cout << sum % << endl;
return ;
}
逆序对 -- cogs1438 火柴排队的更多相关文章
- [树状数组+逆序对][NOIP2013]火柴排队
火柴排队 题目描述 涵涵有两盒火柴,每盒装有n根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑ (ai-bi)2,i=1,2,3,. ...
- Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对
题目:http://codevs.cn/problem/3286/ 3286 火柴排队 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : ...
- [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)
[NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...
- luogu P1966 火柴排队 (逆序对)
luogu P1966 火柴排队 题目链接:https://www.luogu.org/problemnew/show/P1966 显然贪心的想,排名一样的数相减是最优的. 证明也很简单. 此处就不证 ...
- NOIP 2013 T2 火柴排队 ---->求逆序对
[NOIP2013T2]火柴排队 背景 noip2013day1 描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各 自 排成一列, 同一列火柴的高度互不相同, ...
- P1966 火柴排队——逆序对(归并,树状数组)
P1966 火柴排队 很好的逆序对板子题: 求的是(x1-x2)*(x1-x2)的最小值: x1*x1+x2*x2-2*x1*x2 让x1*x2最大即可: 可以证明将b,c数组排序后,一一对应的状态是 ...
- NOIP2013火柴排队[逆序对]
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- NOIP 2013 提高组 day1 T2 火柴排队 归并 逆序对
描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑i=1n(ai−bi)2∑i=1n(ai−bi) ...
- 【题解】洛谷P1966 [NOIP2013TG] 火柴排队(树状数组+逆序对)
次元传送门:洛谷P1966 思路 显然在两排中 每排第i小的分别对应就可取得最小值(对此不给予证明懒) 所以我们只在意两排的火柴是第几根 高度只需要用来进行排序(先把两个序列改成有序的方便离散化) 因 ...
随机推荐
- 19-SQLServer定期自动导入数据的dtsx部署
一.注意点 1.登录Integration Service必须使用windows用户,并且只能在本地服务器登录. 2.SQLServer2000以前,叫dts,全程Data Transformatio ...
- vue_03总结
vue_03总结 1.组件: html.css.js的集合体 vue实例就代表组件 组件用template实例成员管理html结构,有且只有一个根标签 子组件可以复用,所以数据要组件化处理,data的 ...
- Android控件_RecycleView+CarView+Palette联合应用
最终效果 表格布局 垂直布局 横向布局 添加引用 build.gradle implementation 'com.android.support:recyclerview-v7:28.0.0' im ...
- 1、创建MFC应用程序——单个文档
文件——新建——项目——MFC应用程序 运行即可. [菜单栏单击事件] 视图——其他窗口——资源视图,双击Menu中的IDR_MAINFRAM,打开菜单栏.在主菜单栏输入“显示你好”. “显示你好”处 ...
- asp.net上传大文件的解决方案
IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头. 一. 两个必要响应头Accept-Ranges.ETag 客户端每次提交下载请求时,服务 ...
- java+大文件上传下载
文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ...
- Friend-Graph (HDU 6152)2017中国大学生程序设计竞赛 - 网络选拔赛
Problem Description It is well known that small groups are not conducive of the development of a tea ...
- LG2467 地精部落
题意 给出\(n\),求有几个\(W\)形的\(n\)的全排列(震荡) 思路 可以变求出第二个数比第一个数大的,再翻倍就好 设\(f[i][j]\)表示\(i\)个数中\(j\)个数不符合序列 转移时 ...
- C/C++程序基础-如何理解C++是面向对象化的,而C是面向过程化的
1:答:C是面向过程化的,但是C++不是完全面向对象化的.在C++中也完全可以写出与C一样过程化的程序,所以只能说C++拥有面向对象的特性.Tava是真正面向对象化的.
- MySQL-UDF和MOF提权
MOF提权 MOF文件是mysql数据库的扩展文件(在c:/windows/system32/wbem/mof/nullevt.mof) 叫做”托管对象格式”,其作用是每隔五秒就会去监控进程创建和死亡 ...