// 预处理出所有数在这个序列内和1...n的大小关系的前缀和
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,a[5005],dp[5005][5005];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),a[i]++;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i]>j)
dp[i][j]=dp[i-1][j]+1;
else
dp[i][j]=dp[i-1][j];
}
}
int sum=0;
for(int i=1;i<=n;i++) //计算所有逆序数对
sum+=dp[i][a[i]];
int Max=0,count=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
{
int now=dp[j][a[j]]+dp[i][a[i]];
int next=dp[i][a[j]]+dp[j][a[i]];
int temp=(now-next)*2+1; //i,j改变后i..j区间的逆序数对的变化
if(temp>Max)
Max=temp,count=1;
else if(temp==Max)
count++;
}
}
printf("%d %d\n",sum-Max,count);
return 0;
}Codeforces Round #212 (Div. 2) C
最新推荐文章于 2025-07-28 11:16:14 发布
本文介绍了一种高效算法用于计算序列中所有数与其1到n的大小关系形成的逆序对总数,并通过预处理优化了复杂度。
1340

被折叠的 条评论
为什么被折叠?



