NOIP2013 火柴排隊(逆序對)

2021-07-16 12:39:09 字數 2161 閱讀 4648

涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。 現在將每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 兩列火柴之間的距離定義為: ∑(ai-bi)^2

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

每列火柴中相鄰兩根火柴的位置都可以交換,請你通過交換使得兩列火柴之間的距離最小。請問得到這個最小的距離,最少需要交換多少次?如果這個數字太大,請輸出這個最小交換次數對 99,999,997 取模的結果。

輸入格式:

輸入檔案為 match.in。

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

第二行有 n 個整數,每兩個整數之間用乙個空格隔開,表示第一列火柴的高度。

第三行有 n 個整數,每兩個整數之間用乙個空格隔開,表示第二列火柴的高度。

輸出格式:

輸出檔案為 match.out。

輸出共一行,包含乙個整數,表示最少交換次數對 99,999,997 取模的結果。

輸入樣例#1:

【輸入輸出樣例 1】

42 3 1 4

3 2 1 4

【輸入輸出樣例 2】

41 3 4 2

1 7 2 4

輸出樣例#1:

【輸入輸出樣例 1】

1【輸入輸出樣例 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

思路:1、由排序不等式推出兩組大小順序對應一致取到最小值。

2、由亂序鄰位變換成順序最少需要的次數是其逆序數。簡單證明:要保證最小移動次數,即要保證移動過程中只能減小逆序數不能增加,移動相鄰兩位可能增加乙個逆序數或減少乙個逆序數,所以只處理逆序對不會增加。

**樹狀陣列

#include #include #include #include #include #define mod 99999997

#define maxn 200005

using namespace std;

int n,a[maxn],b[maxn],c[maxn],d[maxn],s[maxn],f[maxn],p[maxn],ans=0;

int get()

int lowbit(int x)

void add(int x)

}int getsum(int x)

return ret;

}void init()

}void solveit()

printf("%d\n",ans);

}int main()

歸併排序法

#include #include #include #include #include #define maxn 200005

#define mod 99999997

using namespace std;

int n,a[maxn],b[maxn],c[maxn],d[maxn],p[maxn],s[maxn],ans=0,tmp[maxn];

int get()

void init()

for(int i=1;i<=n;++i)s[i]=p[a[i]];

}void merge(int l,int m,int r)

else

} while(i<=m)tmp[k++]=s[i++];

while(j<=r)tmp[k++]=s[j++];

for(int t=l;t<=r;++t)s[t]=tmp[t];

}void solveit(int l,int r)

}int main()

NOIP2013 逆序對 火柴排隊

題目 涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為 ai bi 2 其中 ai 表示第一列火柴中第 i 個火柴的高度,bi 表示第二列火柴中第 i 個火柴的高度。每列火柴中相鄰兩根火柴的位置都可以交換,...

NOIP2013 火柴排隊 線段樹 逆序對

codevs 題目描述 description 涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為 其中 ai表示第一列火柴中第 i 個火柴的高度,bi表示第二列火柴中第 i 個火柴的高度。每列火柴中相鄰兩根...

NOIP2013 火柴排隊

題目 分析 a中第幾大一定對應b中第幾大。ab同時移動相當於a移動,相對位置不變。所以,用c i 表示a i 需要移動到的 位置,求其中的逆序對。因為乙個每移動相鄰兩個元素相當於消除乙個逆序對。include include using namespace std const int tmax 10...