[NOIp2013] luogu P1966 火柴排队
磕了瓶魔爪。
题目描述
你有两个长度为 NNN 的数组 a,ba,ba,b,试重新排列 aaa 数组使得S=∑i=1n(ai−bi)2S=\sum_{i=1}^{n}{(a_i-b_i)^2}S=i=1∑n(ai−bi)2的值最小。你可且仅可以交换相邻的两个数。求最小交换数对 99,999,99799,999,99799,999,997 取模的值。
Solution
容易得到(∑i=1nai)2+(∑i=1nbi)2=S−2∑i=1naibi(\sum_{i=1}^{n}{a_i})^2+(\sum_{i=1}^{n}{b_i})^2=S-2\sum_{i=1}^{n}{a_ib_i}(i=1∑nai)2+(i=1∑nbi)2=S−2i=1∑naibi
显然前几项都是定值,我们只能在最后一项中做文章。
注意到,将 a,ba,ba,b 数组排序后,aia_iai 与 bib_ibi 配对一定最优(反证法证明)。于是先离散化,然后排序,树状数组求逆序对个数即可。时间复杂度 O(nlogn)O(n\log n)O(nlogn)。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
const int MAXN=100010;
const int MOD=99999997;
int n;
struct node{
int d,id;
friend bool operator<(const node a,const node b){
return a.d<b.d;
}
}a[MAXN],b[MAXN];
int c[MAXN];
int bk[MAXN];
void Sort(){
//此处写的较为繁琐,但是可读性强
std::sort(a+1,a+n+1);
for(int i=1;i<=n;++i)
c[a[i].id]=i;
for(int i=1;i<=n;++i)
a[i].id=c[i];
std::sort(b+1,b+n+1);
for(int i=1;i<=n;++i)
c[b[i].id]=i;
for(int i=1;i<=n;++i)
b[i].id=c[i];
for(int i=1;i<=n;++i)
c[a[i].id]=i;
for(int i=1;i<=n;++i)
a[i].id=c[b[i].id];
}
int tree[MAXN];
int lowbit(int x){
return x&(-x);
}
void change(int x,int y){
while(x<=n){
tree[x]+=y;
x+=lowbit(x);
}
}
int que(int x){
int cnt=0;
while(x){
cnt+=tree[x];
x-=lowbit(x);
}
return cnt;
}
int query(int l,int r){
return que(r)-que(l-1);
}
//求逆序对个数
void Calc(){
memset(tree,0,sizeof(tree));
for(int i=1;i<=n;++i)
bk[a[i].id]=i;
int cnt=0;
for(int i=1;i<=n;++i){
change(bk[i],1);
cnt=(cnt+query(bk[i]+1,n))%MOD;
}
printf("%d",cnt);
}
inline int read(){
int x=0; char c;
do c=getchar(); while(c<'0'||c>'9');
while(c>='0'&&c<='9')
x=x*10+c-48,c=getchar();
return x;
}
int main(){
n=read();
for(int i=1;i<=n;++i){
a[i].d=read();
a[i].id=i;
}
for(int i=1;i<=n;++i){
b[i].d=read();
b[i].id=i;
}
Sort();
Calc();
}
[NOIp2013] luogu P1966 火柴排队的更多相关文章
- luogu P1966 火柴排队 (逆序对)
luogu P1966 火柴排队 题目链接:https://www.luogu.org/problemnew/show/P1966 显然贪心的想,排名一样的数相减是最优的. 证明也很简单. 此处就不证 ...
- Luogu P1966 火柴排队
这还是一道比较简单的题目,稍微想一下就可以解决.终于有NOIP难度的题目了 首先我们看那个∑(ai-bi)^2的式子,发现这个的最小值就是排序不等式 所以我们只需要改变第一组火柴的顺序,使它和第二组火 ...
- [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)
[NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...
- 【刷题】洛谷 P1966 火柴排队
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- 洛谷 P1966 火柴排队 解题报告
P1966 火柴排队 题目描述 涵涵有两盒火柴,每盒装有 \(n\) 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: \(\s ...
- 洛谷——P1966 火柴排队&&P1774 最接近神的人_NOI导刊2010提高(02)
P1966 火柴排队 这题贪心显然,即将两序列中第k大的数的位置保持一致,证明略: 树状数组求逆序对啦 浅谈树状数组求逆序对及离散化的几种方式及应用 方法:从前向后每次将数插入到bit(树状数组)中, ...
- P1966 火柴排队(逆序对)
P1966 火柴排队 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi) ...
- P1966 火柴排队——逆序对(归并,树状数组)
P1966 火柴排队 很好的逆序对板子题: 求的是(x1-x2)*(x1-x2)的最小值: x1*x1+x2*x2-2*x1*x2 让x1*x2最大即可: 可以证明将b,c数组排序后,一一对应的状态是 ...
- [洛谷P1966] 火柴排队
题目链接: 火柴排队 题目分析: 感觉比较顺理成章地就能推出来?似乎是个一眼题 交换的话多半会往逆序对上面想,然后题目给那个式子就是拿来吓人的根本没有卵用 唯一的用处大概是告诉你考虑贪心一波,很显然有 ...
随机推荐
- JavaScript和JQuery进行页面跳转
1.JavaScript页面跳转 .我们可以利用http的重定向来跳转 window.location.replace("网址"); .使用href来跳转 window.locat ...
- 【学习笔记】第二章 python安全编程基础---python爬虫基础(urllib)
一.爬虫基础 1.爬虫概念 网络爬虫(又称为网页蜘蛛),是一种按照一定的规则,自动地抓取万维网信息的程序或脚本.用爬虫最大的好出是批量且自动化得获取和处理信息.对于宏观或微观的情况都可以多一个侧面去了 ...
- PHP 扩展开发初探
什么是 PHP 扩展 通俗说,PHP 扩展是增强 PHP 语言功能的插件.PHP 提供了编程语言的语法,比如分支.循环.函数.类等,这些是 PHP 本身所提供的.在某些情况下需要在 PHP 语言的基础 ...
- Phpstudy被暴存在隐藏后门-检查方法
Phpstudy被暴存在隐藏后门-检查方法 一.事件背景 Phpstudy软件是国内的一款免费的PHP调试环境的程序集成包,通过集成Apache.PHP.MySQL.phpMyAdmin.ZendOp ...
- tcp居然会数据延迟40ms被发送
tcpdump是很好的tcp分析工具,在此配合nc命令来学习tcpdump nc -l 8000 tcpdump -S -n -i lo tcp and host 127.0.0.1 and port ...
- [VB.NET Tips]程序的启动和终止
当执行一个VB.NET应用程序时,CLR会把IL翻译成x86指令,并且寻找一个名为Main的方法. 并从该方法开始执行程序.Main方法也称为程序的"入口"(entry point ...
- 【linux】【FastDFS】FastDFS数据迁移
后来同步的时候发现有的没有同步过来,应该是没有同步完成我就停止服务了. 最后尝试直接把fastdfs storage的data文件迁移过去即可. 1.在新的storage server服务器上停止所有 ...
- Wordpress对接小程序配置过程
最近发现一个很棒的开源项目-WordPress版微信小程序 https://github.com/iamxjb/winxin-app-watch-life.net,详细看了下介绍非常棒,不仅支持的功 ...
- 从壹开始学习 NetCore 新篇章 ║ Blog.Core 开发社之招募计划书
宫 哈喽大家好,国庆马上就要来了,在新的第四季度来临之际,祝大家年末能顺顺利利,解决所有的难题.大家可能从我的标题里也能看的出来,老张又要耍花样,搞事情了,近来随着 netcore 3.0 的正式推出 ...
- C#之WPF连接sqllite数据库
using System; using System.Collections.Generic; using System.Data; using System.Data.SQLite; namespa ...