三分Wa#24~#27求调
查看原帖
三分Wa#24~#27求调
1284725
WJnY楼主2024/8/13 15:51
#include <cstdio>
#include <iostream>
using namespace std;
const int MAXN = 2e5 + 12;
int n,a[MAXN];
bool b[MAXN];
long long s[MAXN],sdis[MAXN];
long long query(int l,int r,bool fol)
{
	if (l==r) return 0;
	long long k,w;
	if (l<r) 
	{
		k = (l==0)?s[r]:s[r]-s[l-1],w = (l==0)?sdis[r]:sdis[r]-sdis[l-1];
	}
	else 
	{
		k = s[r] + s[n-1] - s[l-1],w = sdis[n-1] - sdis[l-1] + sdis[r] + n*s[r];
		r = r+n;
	}
	if (fol==0) return w - k*l - k*(k-1)/2;
	else return k*r - k*(k-1)/2 - w;
}
void work()
{
	scanf("%d",&n);
	for (int i=0;i<n;i++) scanf("%d",a+i);
	for (int i=0;i<n;i++)
		if(i==n-1) b[i]=(a[n-1]>a[0]);
		else b[i] = (a[i]>a[i+1]);
	s[0]=b[0];sdis[0] = b[0]*0;
	for (int i=1;i<n;i++) s[i]=s[i-1]+b[i];
	for (int i=1;i<n;i++) sdis[i]=sdis[i-1]+1ll*b[i]*i;
	long long ans = 1e15;
	for (int i=0;i<n;i++)
	{
		int j = (i+n-1)%n;
		int l=0,r=n-2,lm,rm;
		while(r-l>=5) 
		{
			lm = l + (r-l)/3,rm = r - (r-l)/3;
			int tl = (i+lm)%n,tr = (i+rm)%n;
			long long yl = query(i,tl,1)+query((tl+1)%n,j,0),yr = query(i,tr,1)+query((tr+1)%n,j,0);
			if (yl>yr) l=lm;
			else r=rm;
		}
		for (int o=l;o<=r;o++)
		{
			int t = (i+o)%n;
			ans = min(ans,query(i,t,1)+query((t+1)%n,j,0));
		}
	}
	printf("%lld\n",ans);
}
int main()
{
	int t;scanf("%d",&t);
	while (t--) work();
	return 0;
 } 
2024/8/13 15:51
加载中...