分析:前段时间做的,大概是先求逆序数,再根据这个O(m)推出可能的最大逆序数。
类型:单点更新, 树状数组 / 线段树
代码(树状数组):
#include<cstdio> #include<cstring> using namespace std; #define MAXN 5002 #define INF 1<<30 #define LOWBIT(x) x&(-x) int c[MAXN]; int a[MAXN]; //原序 int n; void insert(int e) { while(e<=n) { c[e]+=1; e+=LOWBIT(e); } } int sum(int e) { int ret=0; while(e>0) { ret += c[e]; e-=LOWBIT(e); } return ret; } int solve(int rank) { int ans=INF; for(int i=0; i<n; i++) { rank = rank-a[i]+n-a[i]-1; ans=ans<rank?ans:rank; } return ans; } int main() { while(scanf("%d", &n)!=EOF) { memset(c, 0, sizeof(c)); //老是忘记清c[]............ int rank=0; for(int i=0; i<n; i++) { int t; scanf("%d", &t); a[i] = t; insert(t+1); //t+1 避免0下标,tle的...... rank+=i+1-sum(t+1); //加上比 t 大的数的个数 } printf("%d\n", solve(rank)); } }