NOIP2013 D1 T2火柴排隊

2022-04-30 10:42:11 字數 2218 閱讀 8903

涵涵有兩盒火柴,每盒裝有 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#include

#include

#include

#include

#include

#define n 100001

#define m 99999997

using

namespace

std;

struct

match1a[n];

struct

match2b[n];

//好吧,做這題的時候我很腦殘地開了兩個結構體,其實只需要乙個

int c[n*4

],sum[n],n,ans;

intcmp(match1 x,match1 y)

intcomp(match2 x,match2 y)

int lowbit(int

x)void add(int i)//

樹狀陣列

}int que(int i)//

求逆序對

return

num;

}int

main()

for(int i=1;i<=n;i++)

//讀入兩列火柴

sort(a+1,a+n+1,cmp);//

第一列火柴排序

sort(b+1,b+n+1,comp);//

第二列火柴排序

for(int i=1;i<=n;i++)

sum[a[i].pos]=b[i].pos;//

for(int i=1;i<=n;i++)

ans+=que(n-sum[i]),add(n-sum[i]+1),ans%=m;//

操作同時進行,不會有影響

coutreturn0;

}

noip2013 d1t2 火柴排隊

看不出是逆序對.感覺藥丸 首先要看出最優解就是兩個陣列均有序的時候 再對兩個陣列的下標求逆序對即可 歸併 樹狀陣列 1 include2 include3 include4 include5 include6 define modd 99999997 7using namespace std 8co...

NOIP2013D1T2 火柴排隊 題解

題目描述略 對於距離最小,其貪心策略為將兩序列公升序排序後比較。以下為簡易的證明 設對任意 a1 a2,b1 b2,第一種排布是 a1a2.b1b2.此時距離為 a1 b1 2 a2 b2 2 1 第二種排布是 a1a2.b2b1.此時距離為 a1 b2 2 a2 b1 2 2 用 1 式減去 2 ...

2013NOIP D1 T2 火柴排隊

題目點這裡 題目大意 有兩列火柴,給出他們的根數和他們對應的長度ai,bi,並且規定距離為 解題思路 怎麼使距離最小?哈哈哈哈,是在兩個佇列裡面的火柴相對應 a集合火柴中第i小對應b集合中第i小 將兩個集合排序 為了讓ab相對應 因為排好序a,b是最小的,所以a下標與b下標就要對應 然後按照a去處理...