洛谷P1966 火柴排隊 逆序對

2021-09-07 20:16:33 字數 757 閱讀 7065

題目鏈結

不算很難的一道題

首先要保證權值最小,不難想到一種貪心策略,即把兩個序列中rank相同的數放到同乙個位置

證明也比較trivial。假設\(a\)中有兩個元素\(a, b\),\(b\)中有兩個元素\(c, d\)

然後分別討論一下當\(a < b\)時\(c\)與\(a\)對應優還是與\(b\)對應優。

化簡的時候直接對兩個式子做差。

這樣我們找到第二個序列中的每個數應該排到哪個位置,樹狀陣列求一下逆序對就行了。

#include#define lb(x) (x & -x)

#define fin(x)

using namespace std;

const int maxn = 1e5 + 10, mod = 99999997;

inline int read()

while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();

return x * f;

}int n, a[maxn], b[maxn], pos[maxn], rak[maxn], date[maxn], t[maxn];

void get(int *a)

void add(int x, int val)

int query(int pos)

int add(int x, int y)

signed main()

洛谷 P1966 火柴排隊

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

洛谷P1966 火柴排隊

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

洛谷P1966 火柴排隊

火柴排隊 感覺比較順理成章地就能推出來?似乎是個一眼題 交換的話多半會往逆序對上面想,然後題目給那個式子就是拿來嚇人的根本沒有卵用 唯一的用處大概是告訴你考慮貪心一波,很顯然有兩個序列中每對排名對應的數放在同一位置上是最優策略這個結論 說詳細一點,假設 a 0 是 a 序列中的第 k 大,b 0 是...