luogu1966 火柴排队
题目大意
涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为: $\sum_{i=1}^n(a_i-b_i)^2$,其中 ai表示第一列火柴中第 i 个火柴的高度,bi表示第二列火柴中第 i 个火柴的高度。 每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99,999,997 取模的结果。
题解
预备知识
- 因为任何a火柴的交换效果都与b交换火柴相同,所以我们只让b火柴移动。
- 通过邻项交换的方法,我们可以得到一个序列的任意一个排列。
贪心
我们让序列$b$序列变换后的结果序列称为$b'$。那么对$\forall i$,$a_i$在$a$中的大小排名与$b'_i$在$b'$中的相同。
证明为邻项交换。如果$a_1$与$b_1$配对,$a_2$与$b_2$配对,$a_1\leq a_2, b_1 \leq b_2$,则这样得到的结果,比$a_1$和$b_2$、$a_2$和$b_1$配对得到的结果小。为了表示方便,我们令$x=a_1,y=b_1,a_2=x+k,b_2=y+t$,则前者的结果为$$(x-y)^2+(x+k-b-t)^2$$,后者结果为$$(a-b-t)^2+(a+k-b)^2$$。后者减去前者得到的结果为$$2kt$$,恒大于0。故原命题成立。
如何得到$b'$?
$b'$的要求是如果将$a$排序的变换为$f(a)$,则$f(b')$得到的序列也是递增的。也就是说,我们要得到$b'$,要先将$b$排序得到$b''$,随后$f^{-1}(b'')=b'$。那么达到$f^{-1}$的方法便是将$a$排序后的rank为下标,原来的id为值得到一个数组,随后将每个$b''$移到对应的id位置去即可。
那么要交换多少次呢?
即为逆序对数。用树状数组解决即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #define ll long long
const int MAX_N = 100010;
const ll P = 99999997;
int N;
int NewId_OrgId[MAX_N]; struct BIT
{
private:
ll C[MAX_N]; int Lowbit(int x)
{
return x & -x;
} public:
void Update(int p, ll delta)
{
while (p <= N)
{
C[p] += delta;
p += Lowbit(p);
}
} ll Query(int p)
{
ll ans = 0;
while (p > 0)
{
ans += C[p];
p -= Lowbit(p);
}
return ans;
}
}g; struct Node
{
int Id, Val; bool operator < (const Node &a) const
{
return Val < a.Val;
}
}A[MAX_N], B[MAX_N], B1[MAX_N]; int main()
{
scanf("%d", &N);
for (int i = 1; i <= N; i++)
A[i].Id = B[i].Id = i;
for (int i = 1; i <= N; i++)
scanf("%d", &A[i].Val);
for (int i = 1; i <= N; i++)
scanf("%d", &B[i].Val);
sort(A + 1, A + N + 1);
for (int i = 1; i <= N; i++)
NewId_OrgId[i] = A[i].Id;
sort(B + 1, B + N + 1);
for (int i = 1; i <= N; i++)
B1[NewId_OrgId[i]] = B[i];
ll ans = 0;
for (int i = N; i >= 1; i--)
{
ans = (ans + g.Query(B1[i].Id - 1)) % P;
g.Update(B1[i].Id, 1);
}
printf("%lld\n", ans);
return 0;
}
luogu1966 火柴排队的更多相关文章
- luogu1966 火柴排队(离散化+树状数组)
由于是一个二次函数的关系,所以易证应该尽量让两组的顺序相同 然后就离散化乱搞几发,最后就变成了求逆序对的数量了 #include<bits/stdc++.h> #define pa pai ...
- $Noip2013/Luogu1966$ 火柴排队 贪心+离散化+逆序对
$Luogu$ $Description$ 给定等长的$a,b$两个序列.每次可以交换一个序列中相邻两个数.求最小的交换次数使得$\sum(a_i-b_i)^2$最小. $Sol$ 交换后的序列一定满 ...
- Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对
题目:http://codevs.cn/problem/3286/ 3286 火柴排队 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : ...
- 洛谷P1966 【火柴排队】
题解 P1966 [火柴排队] 说明: 在数学中有个公式: (a1-b1)^2+(a2-b2)^2<(a2-b1)^2+(a1-b2)^2 (你可以自己试着证一下) 两列火柴对应的两根火柴在各列 ...
- [树状数组+逆序对][NOIP2013]火柴排队
火柴排队 题目描述 涵涵有两盒火柴,每盒装有n根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑ (ai-bi)2,i=1,2,3,. ...
- 【刷题】洛谷 P1966 火柴排队
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)
[NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...
- LOJ2609. NOIP2013 火柴排队 【树状数组】
LOJ2609. NOIP2013 火柴排队 LINK 题目大意: 给你两个数列,定义权值∑i=1(ai−bi)^2 问最少的操作次数,最小化权值 首先需要发现几个性质 最小权值满足任意i,j不存在a ...
- 洛谷 P1966 火柴排队 解题报告
P1966 火柴排队 题目描述 涵涵有两盒火柴,每盒装有 \(n\) 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: \(\s ...
随机推荐
- python嵌套列表
从excel读取一行信息添加到一个临时列表,最后将所有行的列表添加到一个大列表. 源码: import xlrd,reclass Info(): def read_info(self): data = ...
- react-native 0.58版本打包图片问题 task ':app:mergeReleaseResources' Error: Duplicate resources
debug没问题,在生成正式apk的时候就如下: google了一下在github上找到了解决方案: github问题指向 在node_modules/react-native/react.gradl ...
- 06网络通信udp-tcp、正则
一. udp网络程序 1. udp网络程序-发送数据 1)创建客户端套接字 2)发送/接收数据 3)关闭套接字 from socket import * # 1. 创建udp套接字 udp_so ...
- CSU1011: Counting Pixels
Description Did you know that if you draw a circle that fills the screen on your 1080p high definiti ...
- find -print0和xargs -0原理及用法
平常我们经常把find和xargs搭配使用,例如: find . -name "*.txt" | xargs rm 但是这个命令如果遇到文件名里有空格或者换行符,就会出错.因为xa ...
- N分之一 竖式除法模拟
N分之一 Description Alice越来越痴迷于数学问题了.一天,爸爸出了个数学题想难倒她,让她求1 / n. 可怜的Alice只有一岁零九个月,回答不上来 ~~~~(>_<)~~ ...
- About SQL Server 2014 SP1
其实补丁这个月初就放出,个人懒惰所以也没怎么写归整文档 官方Blog: http://blogs.technet.com/b/dataplatforminsider/archive/2015/05/1 ...
- git-svn 简易 操作指南
git-svn 简易 操作指南 本文用以为使用svn的用户提供git操作指导,方便使用git管理用户自己的 本地修改 1:下载 库 下载全部历史记录 git svn clone svn://fhnws ...
- 九度oj 题目1202:排序
题目1202:排序 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:28802 解决:9408 题目描述: 对输入的n个数进行排序并输出. 输入: 输入的第一行包括一个整数n(1<=n ...
- HTML5 & CSS3 & font-family
HTML5 & CSS3 & font-family 中文字体的英文名称 宋体* SimSun 黑体* SimHei 微软雅黑* Microsoft YaHei 微软正黑体 http: ...