2021.9.29
E2
题意:往一个双端队列deque头或者尾按顺序插入一段序列,要求输出插入后的序列逆序数对最少,输出最少的逆序数对数量。
题解:这题很容易就可以想到树状数组+离散化,但是不知道要怎么插入可以达到最后逆序数对最少。这题需想到局部最优便是全局最优,a[i]插到前面还是后面只需判断前面插入的所有数比它大的多还是小的多,大的多插到前面逆序数对便是较少,反之插到后面,而且前一次的插入前后不会影响后一次插入判断(因为如果这次插到前面,那前一次插到前面还是后面都是在此次插入数的后面),所以只需按顺序插入,每次用树状数组维护前面出现的数取得最优解便可以。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+5;
int n,m,tree[N],a[N],b[N];
int lowbit(int x)
{
return x&(-x);
}
void add(int x)
{
while(x<=200000){
tree[x]++;
x+=lowbit(x);
}
}
int getsum(int x){
int res=0;
while(x>0){
res+=tree[x];
x-=lowbit(x);
}
return res;
}
void solve()
{
cin>>n;
memset(tree,0,sizeof(tree));
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(b