P1966 火柴排隊

2022-04-06 14:38:42 字數 963 閱讀 2455

讓a,b序列中大小排名相對應即可

若a中第j大的位於i,則應該b中第j大位於i

證明:假如a1則排列方式有 a1,a2,b1,b2或 a1,a2,b2,b1那麼

對於這兩種情況上,平方並做差,即可得以上結論

然而大問題是這樣離散化後怎麼搞出交換幾次呢

離散化後

\(c_\)=\(b_i\),然後若我們最後拍完序

定然\(c_i\)=i

也就是記錄了相同排名的值得對應關係

結果是要讓他們一一對應的

也就是上面的

拍完序後,然後就是相同位置對應了

其實也就是記錄了a中第i大的元素的位置和b中的對應位置

#include#include#include#include#includeusing namespace std;

int tree[100001];

struct numa[100001],b[100001];

int n;

const int mod = 99999997;

int a1[100001];

int b1[100001];

int c[100001];

int q[100001];

bool cmp(num x,num y)

return ans;

}int ans;

bool cmp1(const int &x,const int &y)

int main ()

for(int i=1;i<=n;++i)

sort(a+1,a+1+n,cmp);

sort(b+1,b+1+n,cmp);

for(int i=1;i<=n;++i)

for(int i=n;i>=1;--i)

cout<<(ans%mod+mod)%mod;

return 0;

}

P1966 火柴排隊

題意 求兩個為n的序列貢獻值最小需要怎麼移動才能達到,移動 交換相鄰元素,貢獻值 ai bi 2。顯然可以猜出來,排序過後對應的最小。事實上也可以用反證法證明aac bd最小 我們令上面的序列不動,只動下面的序列,首先得到下面序列應該是怎麼樣的。用標號來標誌原來位置,排序過後,把對應位置賦值到陣列上...

P1966 火柴排隊

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

P1966 火柴排隊

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