Luogu P1966 火柴排队
这还是一道比较简单的题目,稍微想一下就可以解决。终于有NOIP难度的题目了
首先我们看那个∑(ai-bi)^2的式子,发现这个的最小值就是排序不等式
所以我们只需要改变第一组火柴的顺序,使它和第二组火柴相对应(即大的对大的,小的对小的)
然后我们离散一下,找出每一个数该去的位置
然后注意到这里的交换方式,相邻交换,这就直接转化为求逆序对的问题了
然后直接上树状数组即可
CODE
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100005,mod=99999997;
struct data
{
int x,num;
}a[N],b[N];
int tree[N],r[N],n,ans;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc();
while (ch<'0'||ch>'9') ch=tc();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
inline bool comp(data a,data b)
{
return a.x<b.x;
}
inline void inc(int &x,int y)
{
if ((x+=y)>=mod) x-=mod;
}
inline int lowbit(int x)
{
return x&(-x);
}
inline int get(int x)
{
int tot=0;
while (x) inc(tot,tree[x]),x-=lowbit(x);
return tot;
}
inline void add(int x)
{
while (x<=n) inc(tree[x],1),x+=lowbit(x);
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i;
for (read(n),i=1;i<=n;++i)
read(a[i].x),a[i].num=i;
for (i=1;i<=n;++i)
read(b[i].x),b[i].num=i;
sort(a+1,a+n+1,comp);
sort(b+1,b+n+1,comp);
for (i=1;i<=n;++i)
r[a[i].num]=b[i].num;
for (i=1;i<=n;++i)
{
inc(ans,get(n)-get(r[i]));
add(r[i]);
}
printf("%d",ans);
return 0;
}
Luogu P1966 火柴排队的更多相关文章
- luogu P1966 火柴排队 (逆序对)
luogu P1966 火柴排队 题目链接:https://www.luogu.org/problemnew/show/P1966 显然贪心的想,排名一样的数相减是最优的. 证明也很简单. 此处就不证 ...
- [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= ...
- 【刷题】洛谷 P1966 火柴排队
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)
[NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...
- 洛谷 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] 火柴排队
题目链接: 火柴排队 题目分析: 感觉比较顺理成章地就能推出来?似乎是个一眼题 交换的话多半会往逆序对上面想,然后题目给那个式子就是拿来吓人的根本没有卵用 唯一的用处大概是告诉你考虑贪心一波,很显然有 ...
随机推荐
- loadrunner 场景设计-集合点设置
场景设计-集合点设置 by:授客 QQ:1033553122 1 作用 通过让多用户在同一时间点上进行并发操作来测试系统的并发处理的能力 2 实现 通过集合点函数来实现. 注意:集合点经常和事务结 ...
- (网页)javascript小技巧(非常全)
事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcE ...
- Xamarin入门,开发一个简单的练手APP
之前周末用Xamarin练手做了个简单APP,没有啥逻辑基本就是个界面架子,MVVM的简单使用,还有Binding,Command的简单使用,还有一个稍微复杂点两个界面交互处理(子页面新增后关闭,父页 ...
- [HDFS_2] HDFS 的 Shell 操作
0. 说明 在 Shell 下完成对 HDFS 的增删改查操作 1. 在 Shell 下完成对 HDFS 的增删改查操作 [1.0 查看帮助] [centos@s101 ~]$ hdfs dfs -h ...
- Android中使用databinding编译时出现的error:Execution failed for task ':app:dataBindingProcessLayoutsDebug'
Windows环境下使用svn对AndroidStudio更新代码时,总会在源文件中出现一堆乱码,尤其是xml文件中的乱码,不仅找起来费劲,改起来更费劲. 最近从svn更新代码之后,编译时出现了下面这 ...
- Vue、Vuex+Cookie 实现自动登陆 。
概述 1.自动登陆实现思路. 2.vuex + cookie 多标签页状态保持. 自动登陆的需求: 1.登陆时勾选自动登陆,退出登陆或登陆到期后再次登陆后自动填写表单(记住密码)或访问登陆页自动登陆. ...
- Alpha冲刺! Day1 - 磨刀
Alpha冲刺! Day1 - 磨刀 序章 Alpha冲刺开始的比印象中的计划早,翻回去看系统设计那篇作业博客的实践时间安排表格发现不!见!了!! 因为计划提前,但又必须在编码开始之前把所有逻辑讨论清 ...
- 支付宝alipay移动支付
通过支付宝提供的API实现移动支付功能 一:下载相关的依赖和工具 蚂蚁金服 https://open.alipay.com/platform/home.htm 移动支付开发文档 https://doc ...
- [Jsoi2015]染色问题
题目 看到这个限制条件有点多,我们就一直容斥好了 先容斥颜色,我们枚举至少不用\(i\)种颜色 再容斥列,我们枚举至少不用\(j\)列 最后容斥行,枚举至少不用\(k\)行 容斥系数显然是\((-1) ...
- vue.js 防暴力点击方案
import lodash from 'lodash' <input v-on:onclick ="doStuff">methods: { doStuff:loadsh ...