题干
题意
求冒泡排序某数组交换次数
思路
冒泡排序老朋友了,每次交换是交换一对逆序对,会使逆序对数目减少1,所以交换次数其实就是逆序数对数
逆序数维护可以使用线段树/树状数组。
思路是维护区间内插入数字个数,每次新插入后,插入数字排序-小于他的数字个数即可。
因为线段树维护区间是取值区间,为了恶心你一般会开到很大(longlong),为了便于维护要先用离散化
教训/收获
离散化真香,套板子就行了
代码
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<string>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
#define int long long
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
const int inf=0x3f3f3f3f;
ll n,m;
struct segtree{
ll l,r;
ll val;
} t[maxn<<2]