尼玛=,=
同样的程序
int n就是WA
long long n就是AC
题目is so 坑
说着可怕
其实就是逆序对数
其实我是看到题目分类树状数组才想到这点的=,=
我们看到至少有一组逆序对是相邻的,否则已经单调上升
交换这组逆序对
逆序对数减一
仍至少有一组逆序对是相邻的
反复此操作
由于逆序对数P有限
至少P次使得逆序对数没有<==>单调上升
所以P为所求
#include<iostream>
#include<vector>
#include<algorithm>
#define LL long long
#define N 500010
using namespace std;
vector<LL>L,map;
vector<LL>::iterator iter;
int tree[N<<1];
int LB(int x){ return x&(-x); }
void add(int w,int d){
for(;w<=N+3;w+=LB(w))tree[w]+=d;
}
int get_sum(int w){
int res=0;
for(;w>0;w-=LB(w))res+=tree[w];
return res;
}
int Bfind(int x){
iter=lower_bound(map.begin(),map.end(),x);
return iter+2-map.begin();
}
int main(){
LL n;
while(cin>>n){
if(!n)break;
L.clear();
map.clear();
LL x;
int i;
for(i=1;i<=n;i++){
cin>>x;
L.push_back(x);
map.push_back(x);
}
sort(map.begin(),map.end());
iter=unique(map.begin(),map.end());
map.erase(iter,map.end());
for(i=1;i<=N+3;i++)tree[i]=0;
LL res=(n-1)*n/2;
for(i=0;i<n;i++){
int w=Bfind(L[i]);
res-=get_sum(w);
add(w,1);
}
cout<<res<<"\n";
}
return 0;
}