每盒裝有
其中每列火柴中相鄰兩根火柴的位置都可以交換,請你通過交換使得兩列火柴之間的距離最小。請問得到這個最小的距離,最少需要交換多少次?如果這個數字太大,請輸出這個最小交換次數對
由於交換
對於特定的兩組
對應元素排名相同.
故先離散,再求逆序對即為答案(可以通過歸併或樹狀陣列求解)
#include #include #include #include using namespace std;
using ll = long long;
const int maxn = 1e6 + 5;
const int mod = 99999997;
int n;
struct node a[maxn], b[maxn];
int hashx[maxn];
bool cmp1(node, node);
bool cmp2(node, node);
ll ans;
ll p[maxn];
void mergesort(int, int);
int bit[maxn];
void add(int pos, int key);
int query(int pos);
int main()
cout << ans << endl;
return 0;
}void merge(int l, int mid, int r);
void mergesort(int l, int r)
}ll l[maxn], r[maxn];
void merge(int l, int mid, int r)
k++;
}}#define lowbit(x) (x & (-x))
void add(int pos, int key)
}int query(int pos)
return res;
}bool cmp1(node x, node y)
bool cmp2(node x, node y)
luogu P1966 火柴排隊
做水題好爽.展開式子 就是最大化 2 a i b i 顯然令大的乘大的能最大化上式 相當於用最小步數把1序列轉化為2序列 對映後求逆序對.include include includeinline int read while c 9 c 0 x x 10 c 0 c getchar return ...
Luogu P1966 火柴排隊
這還是一道比較簡單的題目,稍微想一下就可以解決。終於有noip難度的題目了 首先我們看那個 ai bi 2的式子,發現這個的最小值就是排序不等式 所以我們只需要改變第一組火柴的順序,使它和第二組火柴相對應 即大的對大的,小的對小的 然後我們離散一下,找出每乙個數該去的位置 然後注意到這裡的交換方式,...
Luogu P1966 火柴排隊
link 涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為 sum a i b i 2 其中 a i 表示第一列火柴中第 i 個火柴的高度,b i 表示第二列火柴中第 i 個火柴的高度。每列火柴中相鄰兩根火...