原題傳送門
首先可以證明,兩列火柴中高度排名相等的火柴必須排在上下相鄰的兩個
證明略然後把第乙個序列中的排名對映到第二個序列中
然後問題轉化,轉化成求逆序對數
用樹狀陣列
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 表示...