讓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 個火柴的高度。每列火柴中相鄰兩根火柴的位置都可以交換,請你通過交...