【NOIP2013提高组】火柴排队
https://www.luogu.org/problem/show?pid=1966
Σ(ai-bi)2=Σai2+Σbi2-2Σai*bi,要使Σ(ai-bi)2最小,则需2Σai*bi最大。
由排序不等式可知两列数字里第一大与第一大对应,第二大与第二大对应,……,第k大与第k大对应,……,第n大与第n大对应时,Σai*bi最大。
故先将第一列每个数字映射到第二列排名相同的数字,再求需要交换的次数,也就是逆序对的个数。
#include <algorithm>
#include <iostream>
#include <vector>
#define maxn 100005
typedef long long llint;
using namespace std;
int n;
llint tmp[maxn], sorted[maxn], cnt = ;
void merge_sort(int l, int r)
{
if (l == r)
return; int mid = (l + r) / ;
merge_sort(l, mid);
merge_sort(mid + , r); int p1 = l, p2 = mid + , p = l;
while (p1 <= mid && p2 <= r)
{
if (sorted[p1] <= sorted[p2])
tmp[p++] = sorted[p1++];
else
{
cnt = (cnt + (mid - p1 + )) % ;
tmp[p++] = sorted[p2++];
}
} while (p1 <= mid)
tmp[p++] = sorted[p1++];
while (p2 <= r)
tmp[p++] = sorted[p2++]; for (int i = l; i <= r; i++)
sorted[i] = tmp[i];
}
template <class T> void print(T *p)
{
for (int i = ; i <= n; i++)
cout << p[i] << ' ';
cout << endl;
}
pair<llint, llint> a[maxn], b[maxn];
int rnk[maxn];
int main()
{
ios::sync_with_stdio(false);
cin >> n;
for (int i = ; i <= n; i++)
{
cin >> a[i].first;
a[i].second = i;
}
for (int i = ; i <= n; i++)
{
cin >> b[i].first;
b[i].second = i;
}
sort(a + , a + n + );
sort(b + , b + n + ); for (int i = ; i <= n; i++)
sorted[a[i].second] = b[i].second; // 将第一列排第i名的项与第二列排第i名的项对应
merge_sort(, n);
cout << cnt << endl;
return ;
}
【NOIP2013提高组】火柴排队的更多相关文章
- [NOIP2013提高组]火柴排队
题目:洛谷P1966.Vijos P1842.codevs3286. 题目大意:有两排火柴,每根都有一个高度.设a.b分别表示两排火柴的高度,现在要令$\sum(a_i-b_i)^2$最小.现两排火柴 ...
- [NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路
[NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路 题目大意: 对于长度为\(n(n\le10^5)\)的非负数列\(A\),每次可以选取一个区间\(-1\).问将数列清零至少需要 ...
- [NOIP2013 提高组] 华容道 P1979 洛谷
[NOIP2013 提高组] 华容道 P1979 洛谷 强烈推荐,更好的阅读体验 经典题目:spfa+bfs+转化 题目大意: 给出一个01网格图,和点坐标x,y空格坐标a,b,目标位置tx,ty要求 ...
- 洛谷P1966 [NOIP2013提高组Day1T2]火柴排队
P1966 火柴排队 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi) ...
- NOIP2013 提高组 Day1
https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=83%7C30 期望得分:100+100+100=300 实际得 ...
- [NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)
一开始觉得是网络流..仔细一看应该是最短路,再看数据范围..呵呵不会写...这道题是最大生成树+最近公共祖先.第一次写..表示各种乱.. 因为要求运输货物质量最大,所以路径一定是在最大生成树上的.然后 ...
- 【NOIP2013提高组T3】加分二叉树
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...
- noip2013 提高组
T1 转圈游戏 题目传送门 果不其然 第一题还是模拟题 一波快速幂解决问题 #include<cstdio> #include<cstring> #include<alg ...
- NOIP2013提高组 T2 火柴排队
一开始看也想不到这居然要用到逆序对,归并排序. 先来看看题目: 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间 ...
随机推荐
- Leetcode题解(25)
77. Combinations 题目 分析:求给定数字n,k的组合数,方法是采用深度搜索算法,代码如下(copy网上代码) class Solution { public: void dfs77(v ...
- win7旗舰版安装IIS
1.在控制面板中:程序->打开或关闭Windows功能 2.在弹出的对话窗中,在“Internet服务信息”中作如下勾选(打钩的为全选) 点击确定后安装. 3.安装成功后回到控制面板->系 ...
- Windows环境下多线程编程原理与应用读书笔记(4)————线程间通信概述
<一>线程间通信方法 全局变量方式:进程中的线程共享全局变量,可以通过全局变量进行线程间通信. 参数传递法:主线程创建子线程并让子线程为其服务,因此主线程和其他线程可以通过参数传递进行通信 ...
- win10提示管理员已阻止你运行此应用,如何强制运行
方法/步骤 这里以自己遇到的一个软件为例,下图就是禁止的图画: 在开始菜单中输入"cmd",然后以管理员身份运行: 按住"shift"键,同 ...
- HTML学习笔记 cs2D3D展示基础 第十四节 (原创) 参考使用表
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Problem I: STL——多重集的插入和删除
Problem I: STL--多重集的插入和删除 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1729 Solved: 1258[Submit][ ...
- Problem A: 求平均年龄
Description 定义一个Persons类,用于保存若干个人的姓名(string类型)和年龄(int类型),定义其方法 void addAPerson(string,int) 用于添加1个人的信 ...
- MySQL锁学习之UPDATE
##==============================================================================## 学MySQL也蛮长时间了,可一直停 ...
- NFS服务器的安装与配置
由于实验室的项目需要实现在CephFS之上建立NFS之上,所以记录一下NFS服务器的安装与配置流程. 1.NFS服务的简介: NFS 是 Network File System 的缩写,是Sun公司于 ...
- CLR类型设计之泛型(二)
在上一篇文章中,介绍了什么是泛型,以及泛型和非泛型的区别,这篇文章主要讲一些泛型的高级用法,泛型方法,泛型接口和泛型委托,协变和逆变泛型类型参数和约束性,泛型的高级用法在平时的业务中用的不多,多用于封 ...