noip2013 火柴排隊

2022-05-12 19:58:11 字數 3170 閱讀 9443

涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為:

,其中 ai 表示第一列火柴中第 i 個火柴的高度,bi 表示第二列火柴中第 i 個火柴的高度。

每列火柴中相鄰兩根火柴的位置都可以交換,請你通過交換使得兩列火柴之間的距離最小。請問得到這個最小的距離,最少需要交換多少次?如果這個數字太大,請輸出這個最小交換次數對 99,999,997 取模的結果。

題解:用"顯然"證明法可知,當ai與bi在a和b中的rank相等時,s最小;

於是我們就可以把a陣列對映成有序的,再把b陣列按照a陣列的對映方法對映,這樣就可以按逆序對來做;

求逆序對還是按歸併排序來做吧,樹狀陣列做法雖然簡潔,但需要離散;

**:老版本:

#01: accepted (15ms, 67624kb)

#02: accepted (15ms, 67624kb)

#03: accepted (15ms, 67624kb)

#04: accepted (15ms, 67624kb)

#05: accepted (15ms, 67624kb)

#06: accepted (31ms, 67624kb)

#07: accepted (15ms, 67624kb)

#08: accepted (31ms, 67624kb)

#09: accepted (62ms, 67624kb)

#10: accepted (125ms, 67624kb)

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

#define ll long long

#define up(i,j,n) for(int i=(j);(i)<=(n);(i)++)

#define max(x,y) ((x)

#define min(x,y) ((x)

#define file "1"

const

int maxn=101000,mod=99999997

;int

n;int

a[maxn],b[maxn],q[maxn],c[maxn];

intread()

while(ch<='

9'&&ch>='0')

return flag?-x:x;

}int

d[maxn];

int lowbit(int x)

void add(int x)}

ll get(int x)

void

getni()

printf(

"%i64d\n

",ans);

}const

int step=7,tail=4000000,head=0

;struct

hash

if(t[y].first==0

)

else

return

t[y].second;

}}t,p;

//手寫map,用hash實現map的部分功能

intk[maxn];

void

init()

intmain()

view code

新版本:

#01: accepted (0ms, 5000kb)

#02: accepted (0ms, 5000kb)

#03: accepted (0ms, 5000kb)

#04: accepted (0ms, 5000kb)

#05: accepted (0ms, 5000kb)

#06: accepted (0ms, 5000kb)

#07: accepted (0ms, 5000kb)

#08: accepted (15ms, 5000kb)

#09: accepted (31ms, 5000kb)

#10: accepted (46ms, 5000kb)

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

#define ll long long

#define up(i,j,n) for(int i=(j);(i)<=(n);(i)++)

#define max(x,y) ((x)

#define min(x,y) ((x)

#define file "1"

const

int maxn=101000,mod=99999997

;int

n,c[maxn];

struct

node

}a[maxn],b[maxn];

intread()

while(ch<='

9'&&ch>='0')

return flag?-x:x;

}int

d[maxn];

int lowbit(int x)

void add(int x)}

ll get(int x)

void

getni()

printf(

"%i64d\n

",ans);

}void

init()

intmain()

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