NOIP2013 火柴排隊

2022-05-05 18:03:07 字數 1188 閱讀 7775

傳送門

這道題在處理上還是稍微有點麻煩的……

可以想到,如果使兩列火柴距離差值最小,肯定是每列火柴排名第k高的對應的在同一位置。這樣的話,如果我們把第二列火柴對映為其出現在第一列火柴中的位置,我們只要求一下對映之後的逆序對數即可。

不過不能直接對映,因為有些數並不是公共的,所以我們先把兩個序列都先離散一遍,之後這兩個序列就成了1~n的全排列之中的兩種,我的做法是記錄a序列中所有元素的位置,之後sort一遍,就能直接求出來b序列中的元素在a中的位置是哪了。

最後用樹狀陣列求一下逆序對就可以啦。注意別忘了取模……

看一下**。

#include#include

#include

#include

#include

#include

#include

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

#define rep(i,a,n) for(int i = a;i <= n;i++)

#define per(i,n,a) for(int i = n;i >= a;i--)

#define enter putchar('\n')

using

namespace

std;

typedef

long

long

ll;const

int m = 1000005

;const

int n = 2005

;const ll inf = 1e17+9

;const ll mod = 99999997

;ll read()

while(ch >= '

0' && ch <= '9'

)

return ans *op;

}struct

node

}a[m];

ll n,b[m],c[m],d[m],tot1,tot2,g[m],e[m],ans;

void

add(ll x)

}ll ask(ll x)

return

cur;

}int

main()

printf(

"%lld\n

",ans %mod);

return0;

}

view code

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