【NOIP2013】 火柴排队 贪心+splay
这题为啥我写得这么复杂。
首先我们不难发现,我们将序列$a$和序列$b$排序,考虑两序列内无相同元素,那么最小值显然为$\sum_{i=1}^{n} (a_i-b_i)^2$。
下面考虑做法
首先,我们将序列$a$和序列$b$离散化(以下提及序列$a$和$b$均为离散化后的数字)
然后,我们从前往后枚举序列$a$中的每一个数字,对于序列$a$中第$i$个数字$a_i$,我们在序列$b$中找出数字$a_i$的出现位置,并把它移动到序列$b$中第$i$个位置,与$a_i$对齐。
对于序列$b$,我们用一个$splay$来维护,其中会出现插入和删除操作。
时间复杂度:$O(n log n)$。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<vector>
#define M 100005
#define L long long
#define MOD 99999997
#define lc(x) ch[x][0]
#define rc(x) ch[x][1]
using namespace std; L ans=,n,a[M]={},b[M]={},c[M]={},wei[M]={};
L ch[M][]={},siz[M]={},fa[M]={},root=; void pushup(L x){siz[x]=siz[lc(x)]+siz[rc(x)]+;}
void rotate(L x,L &k){
L y=fa[x],z=fa[y];
if(y==k) k=x;
else{
if(lc(z)==y) lc(z)=x;
else rc(z)=x;
}
L l=(lc(y)!=x),r=l^;
fa[y]=x; fa[x]=z; fa[ch[x][r]]=y;
ch[y][l]=ch[x][r]; ch[x][r]=y;
pushup(y);
pushup(x);
}
void splay(L x,L &k){
while(x!=k){
L y=fa[x],z=fa[y];
if(y!=k){
if((lc(z)==y)^(lc(y)==x)) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
} void ins(L &x,L k,L id){
if(!x) return void(x=id);
if(k<=siz[lc(x)]) ins(lc(x),k,id),fa[lc(x)]=x;
else ins(rc(x),k-siz[lc(x)]-,id),fa[rc(x)]=x;
pushup(x);
}
void del(L id){
splay(id,root);
L x=lc(id),y=rc(id);
siz[id]=; fa[x]=fa[y]=;
lc(id)=rc(id)=;
if(!x) return void(root=y);
if(!y) return void(root=x);
root=x;
while(rc(x)) x=rc(x);
rc(x)=y; fa[y]=x;
splay(x,root);
} signed main(){
scanf("%d",&n);
for(L i=;i<=n;i++) scanf("%lld",a+i),c[i]=a[i];
sort(c+,c+n+);
for(L i=;i<=n;i++) a[i]=lower_bound(c+,c+n+,a[i])-c;
for(L i=;i<=n;i++) scanf("%lld",b+i),c[i]=b[i];
sort(c+,c+n+);
for(L i=;i<=n;i++) b[i]=lower_bound(c+,c+n+,b[i])-c;
for(L i=;i<=n;i++) wei[b[i]]=i; for(L i=;i<=n;i++){
siz[i]=;
ins(root,i-,i);
splay(i,root);
}
for(L i=;i<=n;i++){
int x=wei[a[i]];
splay(x,root);
L nowid=siz[lc(x)]+;
del(x);
ins(root,i-,x);
splay(x,root);
ans+=abs(i-nowid);
}
cout<<ans%MOD<<endl;
}
【NOIP2013】 火柴排队 贪心+splay的更多相关文章
- LOJ2609. NOIP2013 火柴排队 【树状数组】
LOJ2609. NOIP2013 火柴排队 LINK 题目大意: 给你两个数列,定义权值∑i=1(ai−bi)^2 问最少的操作次数,最小化权值 首先需要发现几个性质 最小权值满足任意i,j不存在a ...
- [树状数组+逆序对][NOIP2013]火柴排队
火柴排队 题目描述 涵涵有两盒火柴,每盒装有n根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑ (ai-bi)2,i=1,2,3,. ...
- $Noip2013/Luogu1966$ 火柴排队 贪心+离散化+逆序对
$Luogu$ $Description$ 给定等长的$a,b$两个序列.每次可以交换一个序列中相邻两个数.求最小的交换次数使得$\sum(a_i-b_i)^2$最小. $Sol$ 交换后的序列一定满 ...
- NOIP2013火柴排队[逆序对]
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- [NOIP2013] 火柴排队(归并排序)
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- noip2013 火柴排队
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- jzoj[1438]NOIP2013火柴排队
读题: 相邻两个火柴可以交换?两个火柴序列?嗅到了归并排序的味道. 读完题目之后,我们可以知道,如果想要交换次数最少,可以先固定一个序列不变,比如说a序列不变,变b序列 样例是 4 2 3 1 4 3 ...
- noip2013火柴排队_Solution
要想对任意(ai,bi)和(aj和bj),当ai<aj时,都有bi<=bj:当ai>=aj时,bi>=bj,当对a进行升序排序后(b同时发生改变,从而不改变值,最后有a1& ...
- 洛谷P1966 火柴排队 贪心+离散化+逆序对(待补充QAQ
正解: 贪心+离散化+逆序对 解题报告: 链接在这儿呢quq 这题其实主要难在想方法吧我觉得?学长提点了下说用贪心之后就大概明白了,感觉没有很难 但是离散化这里还是挺有趣的,因为并不是能很熟练地掌握离 ...
随机推荐
- 2018.09.01 loj#2330. 「清华集训 2017」榕树之心(树形dp)
传送门 树形dp好题啊. 我们用w[i]" role="presentation" style="position: relative;">w[ ...
- java判断字符串是否为数字,包括负数
/** * 判断是否为数字,包含负数情况 * @param str * @return */ private boolean isNumeric(String str){ Boolean flag = ...
- html零碎总结
对于引用外部css时,格式是<link href="location" rel="stylesheet"/>,注意rel一定不能少且写成自闭合. 而 ...
- Tomcat 环境变量配置
1.变量和常量 i 和 0 2.环境变量 cmd >set 查看所有环境变量 %PATH% 系统指定可执行文件的搜索路径,可以是 .exe .bat String path=“C:\WINDOW ...
- SQLite数据库下载、安装和学习
SQLite 是一个开源的嵌入式关系数据库,实现自包容.零配置.支持事务的SQL数据库引擎. 其特点是高度便携.使用方便.结构紧凑.高效.可靠.与其他数据库管理系统不同,SQLite 的安装和运行非常 ...
- (KMP 暴力)Corporate Identity -- hdu -- 2328
http://acm.hdu.edu.cn/showproblem.php?pid=2328 Corporate Identity Time Limit: 9000/3000 MS (Java/Oth ...
- Internal Server Error - http code 500
Eror Example 1 :
- 检测Linux服务器端口是否开通
现如今云服务器已经是大势所趋,国内比较著名的云服务器厂商有阿里.腾讯,国外有aws,尽管有的公司目前为止还是使用的物理机,但是无论你是使用的云服务器还是物理机,在运行服务时都必不可少的需要监听到指定的 ...
- 在Windows Server 2012 R2域环境中禁用(取消)密码复杂策略
windows server 2012域环境默认启用密码复杂策略,例如: 至少有六个字符长,包含以下四类字符中的三类字符:英文大写字母(A 到 Z),英文小写字母(a 到 z),10 个基本数字(0 ...
- Asp.Net Mvc ScriptBundle 脚本文件捆绑压缩 导致 脚本出错的问题
由于捆绑压缩会对所有包含的文件进行压缩,无法设置忽略对某个js文件的压缩.导致压缩该js后,脚本出错的问题. 解决方式: 重写 ScriptBundle 的 GenerateBundleRespons ...