資料結構 NOIP2013 火柴排隊

2021-08-10 03:16:52 字數 1383 閱讀 2127

題目

要最小化 a[i]-b[i]

也就是說 a 序列第 k 大的元素必須和序列 b 中第kk 大的元素位置必須一樣

那麼我們我們可以把a b離散化 問題將轉化為b序列要交換幾次可以令其等於a

假設我們現在有離散化後的序列 a = b =

我們令 q[a[i]]=b[i] 相當於以a[i]為關鍵字對序列b[i]排序

若序列a與序列b相等 那麼此時q[a[i]]應該等於a[i]的 也就是q[i] = i

那麼也就是說如果我們想讓序列a與序列b相等 那麼我們需要讓q公升序排列

於是用樹狀陣列求逆序對

順便複習了一下樹狀陣列求逆序對 wang.ty平時打的超熟結果沒給我講出來 不過後來幾經輾轉還是講出來了

發現以前學的一些東西都忘了

**如下

#include

#include

#include

#include

using

namespace

std;

#define in = read();

typedef

long

long ll;

typedef

unsigned

int ui;

const ll size = 100000 + 10000;

#define lowbit(x) x&-x

struct pointa[size] , b[size];

int n;

int mod = 99999997 , ans;

int c[size] , f[size];

inline ll read()

while(isdigit(ch))

return num*f;

}inline

bool cmp(point a , point b)

inline

void add(int x)

}inline

int sum(int x)

return ans;

}int main()

for(register

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

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

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

for(register

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

f[a[i].y] = b[i].y;

for(register

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

printf("%d" , ans);

return0;}

//coyg

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