求hack,悬关
查看原帖
求hack,悬关
484751
ssl_lwz楼主2024/8/19 20:26

rt

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e6 + 10;

int T,n,a[N],ct[N];
bool q[N],h[N];
void solve(){
	cin>>n;
    for(int i=1;i<=n;i++){
    	cin>>a[i];
    	q[i]=h[i]=false;
	}  
	if(n==1&&a[1]==1){
		cout<<0<<endl;
		return;
	} 
	int ans=0;
    //1.
    //if(a[1]==1&&a[n]==n)  ++ans;
    //2.差值为1 d = 1 
	q[1]=q[2]=true;int mx=max(a[1],a[2]),mi=min(a[1],a[2]); 
	for(int i=3;i<n;i++){
		mx=max(mx,a[i]);mi=min(mi,a[i]);
		if(mx-mi+1==i)  q[i]=true;
	}
	//3.差值2 d = 2
	if(abs(a[2]-a[1])%2==0){
		mx=max(a[1],a[2]),mi=min(a[1],a[2]);
		for(int i=3;i<n;i++){
			mx=max(mx,a[i]);mi=min(mi,a[i]);
			if((mx-mi)/2+1==i&&(mx-mi)%2==0)  q[i]=true;
		} 
	}
	 
    h[n]=h[n-1]=true;mx=max(a[n],a[n-1]),mi=min(a[n],a[n-1]); 
 //   cout<<mx<<" "<<mi<<"ccf"<<endl;
	for(int i=n-2,j=3;i>1;i--,++j){
		mx=max(mx,a[i]);mi=min(mi,a[i]);
		//cout<<mx<<" "<<mi<<" "<<j<<endl;
		if(mx-mi+1==j)  h[i]=true;
	}
	//3.差值2 d = 2
	if(abs(a[n]-a[n-1])%2==0){
		mx=max(a[n],a[n-1]),mi=min(a[n],a[n-1]);
		for(int i=n-2,j=3;i>1;i--,++j){
			mx=max(mx,a[i]);mi=min(mi,a[i]);
			if((mx-mi)/2+1==j&&(mx-mi)%2==0)  h[i]=true;
		} 
	}
//	for(int i=1;i<=n;i++)  cout<<h[i]<<" ";
//	cout<<endl;
    for(int i=1;i<n;i++)  ans+=(q[i]&&h[i+1]);
	//cout<<q[i]<<" "<<h[i+1]<<endl;
    cout<<ans<<endl;
}
signed main(){
    cin>>T;
    while(T--){
    	solve();
	}
	return 0;
} 
2024/8/19 20:26
加载中...