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;
}

浙公网安备 33010602011771号