題解 LuoGu1966 火柴排隊

2021-09-29 11:25:46 字數 1230 閱讀 9707

原題傳送門

首先可以證明,兩列火柴中高度排名相等的火柴必須排在上下相鄰的兩個

證明略然後把第乙個序列中的排名對映到第二個序列中

然後問題轉化,轉化成求逆序對數

用樹狀陣列

code:

#include

#define maxn 100010

#define qy 99999997

using

namespace std;

struct nodea[maxn]

, b[maxn]

;int tree[maxn]

, id[maxn]

, id[maxn]

, c[maxn]

, n, ans;

inline

intread()

bool

cmp(node x, node y)

intlowbit

(int x)

void

add(

int x)

intquery

(int x)

intmain()

;for

(int i =

1; i <= n;

++i) b[i]

=(node)

;sort

(a +

1, a +

1+ n, cmp)

;sort

(b +

1, b +

1+ n, cmp)

;for

(int i =

1; i <= n;

++i) id[a[i]

.id]

= i;

for(

int i =

1; i <= n;

++i) id[id[i]

]= i;

for(

int i =

1; i <= n;

++i) c[b[i]

.id]

= id[i]

;for

(int i = n; i;

--i)

(ans +

=query

(c[i]-1

))%= qy,

add(c[i]);

printf

("%d\n"

, ans)

;return0;

}

luogu1966 火柴排隊

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

luogu1966 火柴排隊 離散化 樹狀陣列

由於是乙個二次函式的關係,所以易證應該盡量讓兩組的順序相同 然後就離散化亂搞幾發,最後就變成了求逆序對的數量了 1 include2 define pa pair3 define ll long long 4using namespace std 5const int maxn 100010,mod...

1966 火柴排隊

難度 提高 省選 題目型別 貪心 分治 提交次數 5 涉及知識 逆序對 離散化 涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為 ai bi 2 其中 ai 表示第一列火柴中第 i 個火柴的高度,bi 表示...