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