noip2013火柴排隊 亂搞??

2021-08-22 16:21:46 字數 979 閱讀 7861

這題我糊了乙個假結論就過去了,也不知道這個結論為什麼是對的。。首先sigma((ai-bi)^2)可以拆開,那麼ai^2+bi^2是個常量,而求這個最小就是sigma(-1*ai*bi)最小即sigma(ai*bi)最大,那麼貪心的想一想a陣列中最大的數讓它被計算盡可能多次,也就是想必要和b陣列中最大的對應,那麼次大、次次大...也是同理,也就是要讓a陣列某一排名的和b陣列某一排名的對上(注意可能有相同的排名)。

接下來就是我和標算不一樣的地方。。

標算離散化a,b陣列,然後按a為關鍵字排b,顯然之後為了一一對應就是求逆序對數了,雖然個人覺得有點難想到,但正確性一目了然,很好很優越。。

我的呢,先猜了一波想必在a裡交換和在b裡交換是一樣的,那麼就只用考慮a序列。然後呢,再猜一波可以貪心從左往右考慮,就是從第一位開始向右列舉,找到a序列中這個位置及右側第乙個與b這個位置對應的,計算它交換過來的貢獻,然後因為它交換的路徑上的點右移了1,就用樹狀陣列記錄一下,計算到它們時查詢被右移了多少加上去。。。雖然覺得很假,但手模一波發現貌似自己hack不掉,就信仰打了,沒想到真能a。。。

// luogu-judger-enable-o2

#include#define ll long long

using namespace std;

const int n=100010;

const ll mod=99999997;

struct mohac[n],d[n];

int n,ps[100010];ll a[n],b[n],tr[100010];

vectormp[100010];

bool cmp(moha x,moha y)

int ask(int x)

void add(int r)

int main()

for(int i=1;i<=n;i++)ps[a[i]]=i;

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

cout<}

NOIP2013 火柴排隊

題目 分析 a中第幾大一定對應b中第幾大。ab同時移動相當於a移動,相對位置不變。所以,用c i 表示a i 需要移動到的 位置,求其中的逆序對。因為乙個每移動相鄰兩個元素相當於消除乙個逆序對。include include using namespace std const int tmax 10...

NOIP 2013 火柴排隊

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

noip2013 火柴排隊

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