P1966 火柴排队
题意:有两列火柴,各有各的高度,两两高度不同,每次只能交换相邻的数,问最少交换多少次,使得 ∑ ( a i − b i ) 2 \sum (a_i-b_i)^2 ∑(ai−bi)2最小。
解法:离散化+树状数组!
因为数据各不相同,可以想到最优的情况一定是最小的对应第二组的最小的,次小的对应次小的,…,那么可以清楚这题跟数字的大小无关,只和相对大小有关,那么能想到离散化,这里是离散化的两种方法,刚开始理解的时候,会错了意思,以为离散化以后,只是把离散化后的值采取p[a[i]]=b[i],所以采用了第二种方法,但是第二种方法离散化以后,不能访问到原数组的下标。仔细想了一下,因为是需要求交换次数的,要展现出相对大小的同时,还要知道原数组中第一小的值位置在哪,第二小的值位置在哪,那么第二种离散化方式用在这题就是错的(只过了一个点)。
代码:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <queue>
#include <cmath>
#include <set>
#include <map>
#include <bitset>
#