luogu P1966 火柴排隊

2022-02-27 16:10:14 字數 646 閱讀 4938

做水題好爽...

展開式子

就是最大化\(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 x * f;

}const int maxn = 100007;

#define lowbit(x) (x & (- x))

#define mod 99999997

int n ;

struct c ;

bool operator < (const c &a)const

} a[maxn],b[maxn];

int has[maxn],tree[maxn << 2];

void update(int x)

int query(int x)

int main()

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

return 0;

}

Luogu P1966 火柴排隊

這還是一道比較簡單的題目,稍微想一下就可以解決。終於有noip難度的題目了 首先我們看那個 ai bi 2的式子,發現這個的最小值就是排序不等式 所以我們只需要改變第一組火柴的順序,使它和第二組火柴相對應 即大的對大的,小的對小的 然後我們離散一下,找出每乙個數該去的位置 然後注意到這裡的交換方式,...

Luogu P1966 火柴排隊

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

luogu P1966 火柴排隊 離散,逆序對

每盒裝有 其中每列火柴中相鄰兩根火柴的位置都可以交換,請你通過交換使得兩列火柴之間的距離最小。請問得到這個最小的距離,最少需要交換多少次?如果這個數字太大,請輸出這個最小交換次數對 由於交換 對於特定的兩組 對應元素排名相同.故先離散,再求逆序對即為答案 可以通過歸併或樹狀陣列求解 include ...