涵涵有兩盒火柴,每盒裝有 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#includeview code#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()
新版本:
#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#includeview code#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()
主要是第乙個版本對映寫的太辣雞了點;
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 個火柴的高度。每列火柴中相鄰兩根火柴的位置都可以交換,請你通...