玄关
查看原帖
玄关
515836
__Louis__楼主2024/8/5 15:32

只过了sub4, 样例都过了

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+10;
int arr[maxn],cmp[maxn];
int sum[maxn*2],cnt[maxn*2]; 
int a=0,b=0;
signed main(){
	int T;
	scanf("%lld",&T);
	while(T--){
//		memset(sum,0,sizeof(sum));
//		memset(cnt,0,sizeof(cnt));
//		memset(arr,0,sizeof(arr));
//		memset(cmp,0,sizeof(cmp));
		int n;
		scanf("%lld",&n);
		for(int i=1;i<=n;i++){
			scanf("%lld",&arr[i]);
			
		}
		for(int i=1;i<=n;i++){
			cmp[i]=arr[(i+1)%n]-arr[i];
			if(cmp[i]<0) cmp[i]=0;
			else cmp[i]=1;
			cmp[i+n]=cmp[i];
		}
//		for(int i=1;i<=2*n;i++){
//			printf("%lld ",cmp[i]);
//		}
//		printf("\n");
		for(int i=1;i<=2*n;i++){
			sum[i]=sum[i-1]+cmp[i],cnt[i]=cnt[i-1]+cmp[i]*i;
		}
//		for(int i=1;i<=2*n;i++){
//			printf("%lld ",sum[i]);
//		}
//		printf("\n");
//		for(int i=1;i<=n*2;i++){
//			printf("%lld ",cnt[i]);
//		}
//		printf("\n\n");
		int ans=0x3f3f3f3f3f3f3f3f;
		int len=(n+1)/2;
		for(int i=1;i<=n;i++){
			int a1=sum[i+len-1]-sum[i-1],a2=sum[i+n-1]-sum[i+len-1];
			int b1=cnt[i+len-1]-cnt[i-1],b2=cnt[i+n-1]-cnt[i+len-1];
			a1=(2*(i+len-1)-a1+1)*a1/2,a2=(2*(i+len)+a2-1)*a2/2;
//			printf("%lld %lld %lld %lld\n",a1,b1,a2,b2);
			ans=min(ans,a1-b1+b2-a2);
		}
//		printf("\n\n");
		printf("%lld\n",ans);
	}
}

2024/8/5 15:32
加载中...