洛谷P1966 [NOIP2013提高组Day1T2]火柴排队
P1966 火柴排队
题目描述
涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2
其中 ai 表示第一列火柴中第 i 个火柴的高度,bi 表示第二列火柴中第 i 个火柴的高度。
每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99,999,997 取模的结果。
输入输出格式
输入格式:
输入文件为 match.in。
共三行,第一行包含一个整数 n,表示每盒中火柴的数目。
第二行有 n 个整数,每两个整数之间用一个空格隔开,表示第一列火柴的高度。
第三行有 n 个整数,每两个整数之间用一个空格隔开,表示第二列火柴的高度。
输出格式:
输出文件为 match.out。
输出共一行,包含一个整数,表示最少交换次数对 99,999,997 取模的结果。
输入输出样例
4
2 3 1 4
3 2 1 4
1
4
1 3 4 2
1 7 2 4
2
说明
【输入输出样例说明1】
最小距离是 0,最少需要交换 1 次,比如:交换第 1 列的前 2 根火柴或者交换第 2 列的前 2 根火柴。
【输入输出样例说明2】
最小距离是 10,最少需要交换 2 次,比如:交换第 1 列的中间 2 根火柴的位置,再交换第 2 列中后 2 根火柴的位置。
【数据范围】
对于 10%的数据, 1 ≤ n ≤ 10;
对于 30%的数据,1 ≤ n ≤ 100;
对于 60%的数据,1 ≤ n ≤ 1,000;
对于 100%的数据,1 ≤ n ≤ 100,000,0 ≤火柴高度≤ maxlongint
【题解】
十分显然
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define min(a, b) ((a) < (b) ? (a) : (b)) inline void read(int &x)
{
x = ;char ch = getchar(), c = ch;
while(ch < '' || ch > '') c = ch, ch = getchar();
while(ch <= '' && ch >= '') x = x * + ch - '', ch = getchar();
if(c == '-') x = -x;
} inline void swap(int &a, int &b)
{
int tmp = a;a = b;b = tmp;
} const int MAXN = + ;
const int MAXM = + ;
const int INF = 0x3f3f3f3f; int n,m,u[MAXM],v[MAXM],w[MAXM],cnt[MAXM],q,s,t,fa[MAXN],b[MAXM]; bool cmp(int a, int b)
{
return w[a] > w[b];
} struct Edge
{
int u,v,w,next;
Edge(int _u, int _v, int _w, int _next){u = _u, v = _v, w = _w, next = _next;}
Edge(){}
}edge[MAXN << ];
int head[MAXN], cntt;
inline void insert(int a, int b, int c)
{
edge[++cntt] = Edge(a,b,c,head[a]);
head[a] = cntt;
} int deep[MAXN], p[][MAXN], mi[][MAXN]; void dfs(int u)
{
b[u] = ;
for(register int pos = head[u];pos;pos = edge[pos].next)
{
int v = edge[pos].v;
if(b[v])continue;
deep[v] = deep[u] + ;
p[][v] = u;
mi[][v] = edge[pos].w;
dfs(v);
}
} void yuchuli()
{
int M = ;
while(( << M) <= n) ++ M;
-- M;
for(register int i = ;i <= M;++ i)
for(register int j = ;j <= n;++ j)
p[i][j] = p[i - ][p[i - ][j]];
for(register int i = ;i <= M;++ i)
for(register int j = ;j <= n;++ j)
mi[i][j] = min(mi[i - ][p[i - ][j]], mi[i - ][j]);
} int LCA(int va, int vb)
{
if(deep[va] < deep[vb]) swap(va, vb);
int M = ;
while(( << M) <= n)++ M;
-- M;
for(register int i = M;i >= ;-- i)
if(deep[vb] + ( << i) <= deep[va])
va = p[i][va];
if(va == vb)return va;
M = ;
while(( << M) <= deep[va]) ++ M;
-- M;
for(register int i = M;i >= ;-- i)
if(p[i][va] != p[i][vb])
{
va = p[i][va];
vb = p[i][vb];
}
return p[][va];
} int find(int x)
{
return x == fa[x] ? x : fa[x] = find(fa[x]);
} int main()
{
read(n), read(m);
for(register int i = ;i <= m;++i)
read(u[i]), read(v[i]), read(w[i]), cnt[i] = i;
for(register int i = ;i <= n;++ i)
fa[i] = i;
std::sort(cnt + , cnt + + m, cmp);
for(register int i = ;i <= m;++i)
{
int f1 = find(u[cnt[i]]), f2 = find(v[cnt[i]]);
if(f1 != f2)
{
fa[f1] = f2;
insert(u[cnt[i]], v[cnt[i]], w[cnt[i]]);
insert(v[cnt[i]], u[cnt[i]], w[cnt[i]]);
}
}
for(register int i = ;i <= n;++ i)
{
if(!b[i])
{
deep[i] = ;
dfs(i);
}
}
yuchuli();
read(q);
int s,t;
int M = ;
while(( << M) <= n) ++ M;
-- M;
for(register int i = ;i <= q;++ i)
{
read(s), read(t);
int f1 = find(s), f2 = find(t);
if(f1 != f2)
{
printf("-1\n");
continue;
}
int lca = LCA(s, t);
int mi1 = INF, mi2 = INF;
for(register int j = M;j >= ;-- j)
if(p[j][s] && deep[p[j][s]] >= deep[lca])
{
mi1 = min(mi1, mi[j][s]);
s = p[j][s];
}
for(register int j = M;j >= ;-- j)
if(p[j][t] && deep[p[j][t]] >= deep[lca])
{
mi2 = min(mi2, mi[j][t]);
t = p[j][t];
}
printf("%d\n", min(mi1, mi2));
}
return ;
}
NOIP2013Day1T2
洛谷P1966 [NOIP2013提高组Day1T2]火柴排队的更多相关文章
- 洛谷P1967 [NOIP2013提高组Day1T2]货车运输
P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过 ...
- 洛谷P1311 [NOIP2011提高组Day1T2]选择客栈
P1311 选择客栈 题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一 ...
- 洛谷P1979 [NOIP2013提高组Day2T3]华容道
P1979 华容道 题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少 ...
- 洛谷P1970 [NOIP2013提高组Day2T2] 花匠
P1970 花匠 题目描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定 把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希 望剩下的花排 ...
- 洛谷P1969 [NOIP2013提高组Day2T1] 积木大赛
P1969 积木大赛 题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前, ...
- NOIP2013提高组 T2 火柴排队
一开始看也想不到这居然要用到逆序对,归并排序. 先来看看题目: 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间 ...
- 【NOIP2013提高组】火柴排队
https://www.luogu.org/problem/show?pid=1966 Σ(ai-bi)2=Σai2+Σbi2-2Σai*bi,要使Σ(ai-bi)2最小,则需2Σai*bi最大. 由 ...
- 洛谷 P2678 & [NOIP2015提高组] 跳石头
题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...
- 洛谷 P1025 & [NOIP2001提高组] 数的划分(搜索剪枝)
题目链接 https://www.luogu.org/problemnew/show/P1025 解题思路 一道简单的dfs题,但是需要剪枝,否则会TLE. 我们用dfs(a,u,num)来表示上一个 ...
随机推荐
- ROC曲线及AUC
ROC曲线 意义 ROC曲线指受试者工作特征曲线 / 接收器操作特性曲线(receiver operating characteristic curve),是反映敏感性和特异性连续变量的综合指标,是用 ...
- SpringBoot学习笔记(七):SpringBoot使用AOP统一处理请求日志、SpringBoot定时任务@Scheduled、SpringBoot异步调用Async、自定义参数
SpringBoot使用AOP统一处理请求日志 这里就提到了我们Spring当中的AOP,也就是面向切面编程,今天我们使用AOP去对我们的所有请求进行一个统一处理.首先在pom.xml中引入我们需要的 ...
- 【机器学习】机器学习入门08 - 聚类与聚类算法K-Means
时间过得很快,这篇文章已经是机器学习入门系列的最后一篇了.短短八周的时间里,虽然对机器学习并没有太多应用和熟悉的机会,但对于机器学习一些基本概念已经差不多有了一个提纲挈领的了解,如分类和回归,损失函数 ...
- Qt源码下载
这是官方下载地址:http://qt.nokia.com/downloads 点击右下角的 ftp.qt.nokia.com - Archive You can find our archive of ...
- WebSockets
WebSocket 是为了在一个单独的持久连接上提供全双工的双向通信.有关WebSocket API的内容可以参考这里. 这里简单说明下WebSocket在javascript中的用法. 1 WebS ...
- ssh 免密码登入
1.普通免密码登入 (1) 生成秘钥 [root@vick ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter f ...
- [转]WPF and Silverlight 学习笔记(二十五):使用CollectionView实现对绑定数据的排序、筛选、分组
在第二十三节,我们使用CollectionView实现了对于绑定数据的导航,除导航功能外,还可以通过CollectionView对数据进行类似于DataView的排序.筛选等功能. 一.数据的排序: ...
- Python pylint的安装和使用
Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准和有潜在问题的代码. Pylint 是一个 Python 工具,除了平常代码分析工具的作用之 ...
- linear-gradient
http://jsbin.com/mocojehosa/edit?html,css,output https://developer.mozilla.org/zh-CN/docs/Web/CSS/li ...
- 如何用SPSS做联合分析
如何用SPSS做联合分析 如果产品的描述是由几个属性特征决定的,比如说mp3的音质.外形.容量.价格等等,商家为了确定哪个属性对消费者的影响最大,以及预测什么样的属性组合最受消费者的欢迎,选择的办法应 ...