P1966 火柴排队

题目描述

涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2

其中 ai 表示第一列火柴中第 i 个火柴的高度,bi 表示第二列火柴中第 i 个火柴的高度。

每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99,999,997 取模的结果。

输入输出格式

输入格式:

输入文件为 match.in。

共三行,第一行包含一个整数 n,表示每盒中火柴的数目。

第二行有 n 个整数,每两个整数之间用一个空格隔开,表示第一列火柴的高度。

第三行有 n 个整数,每两个整数之间用一个空格隔开,表示第二列火柴的高度。

输出格式:

输出文件为 match.out。

输出共一行,包含一个整数,表示最少交换次数对 99,999,997 取模的结果。

输入输出样例

输入样例#1:

4
2 3 1 4
3 2 1 4
输出样例#1:

1
输入样例#2:

4
1 3 4 2
1 7 2 4
输出样例#2:

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]火柴排队的更多相关文章

  1. 洛谷P1967 [NOIP2013提高组Day1T2]货车运输

    P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过 ...

  2. 洛谷P1311 [NOIP2011提高组Day1T2]选择客栈

    P1311 选择客栈 题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一 ...

  3. 洛谷P1979 [NOIP2013提高组Day2T3]华容道

    P1979 华容道 题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少 ...

  4. 洛谷P1970 [NOIP2013提高组Day2T2] 花匠

    P1970 花匠 题目描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定 把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希 望剩下的花排 ...

  5. 洛谷P1969 [NOIP2013提高组Day2T1] 积木大赛

    P1969 积木大赛 题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前, ...

  6. NOIP2013提高组 T2 火柴排队

    一开始看也想不到这居然要用到逆序对,归并排序. 先来看看题目: 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间 ...

  7. 【NOIP2013提高组】火柴排队

    https://www.luogu.org/problem/show?pid=1966 Σ(ai-bi)2=Σai2+Σbi2-2Σai*bi,要使Σ(ai-bi)2最小,则需2Σai*bi最大. 由 ...

  8. 洛谷 P2678 & [NOIP2015提高组] 跳石头

    题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...

  9. 洛谷 P1025 & [NOIP2001提高组] 数的划分(搜索剪枝)

    题目链接 https://www.luogu.org/problemnew/show/P1025 解题思路 一道简单的dfs题,但是需要剪枝,否则会TLE. 我们用dfs(a,u,num)来表示上一个 ...

随机推荐

  1. 前端面试题之一JAVASCRIPT(理论类)

    一.请描述一下 cookies.sessionstorage .localstorage 和session的区别?(1)cookie是网站为了标示用户身份而储存在用户本地终端(client side) ...

  2. 我眼中javascript的这些年

    写了两年多的js了吧,一开始的目标并没有很学术,我只想安安静静做个很厉害的开发者.但是总是沉溺在一种语言里,会让人误以为这种语言很厉害,就像只在村子里混的话,我觉得我自己可以逆天,村外有人,编程世界也 ...

  3. [POI2014]KAR-Cards

    题目链接: 传送门 题目分析: 线段树妙题,感觉思路奇奇怪怪的,虽然对我来说不是"线段树菜题"(\(ldx\)神仙\(blog\)原话)\(QAQ\) 考虑怎么样维护可合并的信息解 ...

  4. Cesium官方教程13--Cesium和Webpack

    原文地址:https://cesiumjs.org/tutorials/cesium-and-webpack/ Cesium 和 Webpack Webpack是非常强大非常流行的JavaScript ...

  5. yii2下使用支付宝

    最近入坑了yii2 感觉是个很强大的框架.使用yii做支付宝的移动支付的时候出了点问题,记录下来避免以后忘记了. 使用的是支付宝立即到账的功能,网上很多集成好的接口我就不重复了,找不到的话github ...

  6. RTNETLINK answers: File exists错误解决方法

    >一.写在前面: 因为是我刚学习linux好多问题需要解决,bolg仅作为记录自己的在技术这条道路上的点点滴滴. 二.事件起因: 最近因为女友的原因消沉的好长时间,在马哥那里的课程的结束到现在已 ...

  7. Codeforces 500D. New Year Santa Network

    题目大意 给你一颗有\(n\)个点的树\(T\),边上有边权. 规定,\(d(i,j)\)表示点i到点j路径上的边权之和. 给你\(q\)次询问,每次询问格式为\(i, j\),表示将按输入顺序排序的 ...

  8. html特殊字符 编码css3 content:"特殊符号"一览

    工作中经常会用到用纯css3美化复选框 <div class="cross"></div> css代码.cross{ width: 20px; height ...

  9. 装配SpringBean(二)--XML方式介绍

    装配SpringBean,我理解的意思就在容器中定义一个bean,然后让容器通过某种方式找到它.因为在Spring中一切皆资源,资源就是所谓的bean,我们怎么才能从容器中获取这些资源呢?那就是控制反 ...

  10. container中的内容 垂直-水平居中

    .container{ display: box; display: -webkit-box; -webkit-box-pack: center; -webkit-box-align: center; ...