P10843 【MX-J2-T4】Turtle and Cycles题解

P10843 【MX-J2-T4】Turtle and Cycles

分析每次操作对不同情况会造成的结果。

结论是会使得差分值互换。

于是将每个数设为 \(op=a_{i+1}>a_{i}\),这时每次操作都会将op值互换,现在问题转化为在环上最少操作次数使得只会有一次 \(a_{i}=0,a_{i+1}=1\) 的情况。

于是双指针,遍历这个中点,使得中点左边的 \(1\) 都到中间,右边的 \(1\) 都到中间。

并且移动次数就是下标差一下。

#include<bits/stdc++.h>
#define ll long long
#define int ll
#define ls p<<1
#define rs p<<1|1
#define re register 
#define pb push_back
#define pir pair<int,int> 
#define f(a,x,i) for(int i=a;i<=x;i++)
#define fr(a,x,i) for(int i=a;i>=x;i--)
#define fi first
#define se second
#define lb(x) (x&-x)
using namespace std;
const int N=2e6+10;
const int M=5e6+10;
const int mod=998244353;
//const int mod=1e9+7;
const int INF=1e18+7;
mt19937 rnd(time(nullptr));

int n;
int a[N];
int op[N];

int sum[N];
int cnt[N];

void solve(){
	cin>>n;
	
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i+n]=a[i];
	}
	
	for(int i=1;i<=n;i++){
		int p=0;
		if(a[i+1]>a[i]){
			p=1;
		}
		op[i]=p;
		op[i+n]=p;
	}
	
	for(int i=1;i<=2*n;i++){
		sum[i]=sum[i-1]+op[i];
		cnt[i]=cnt[i-1]+op[i]*i;
	}
	int len=(n+1)/2;
	int ans=INF;
	for(int i=1;i<=n;i++){
		int a1=sum[i+len-1]-sum[i-1];//左边1的个数 
		int a2=sum[i+n-1]-sum[i+len-1];//右边1的个数 
		
		int b1=(2*(i+len-1)-a1+1)*a1/2-(cnt[i+len-1]-cnt[i-1]);
		int b2=(cnt[i+n-1]-cnt[i+len-1])-(2*(i+len)+a2-1)*a2/2;
		
		ans=min(ans,b1+b2);
	}
	cout<<ans<<"\n";
}



signed main(){
//    freopen("homework3.in","r",stdin);
//    freopen("a.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(nullptr);   
	int t=1;
	cin>>t;
	while(t--){
		solve();
	}	
    return 0;
}
posted @ 2025-11-24 11:54  sad_lin  阅读(3)  评论(0)    收藏  举报