求hark
查看原帖
求hark
1125784
shuidianfei楼主2025/8/30 12:11
#include<bits/stdc++.h>
using namespace std;
#define MAX 5000010
int n,in[MAX];

int add(int l,int r,int last){
	if(l==r || r==0) return -1;
	else if(last==-1){//no exchange
		if(in[r-1]<in[r]) return -1;
		else if(in[r]<in[l]) return 1;
		else return 0;
	}else if(last==1){//exchange 1 time
		if(in[r-1]<in[r] && in[r]<in[l]) return 1;
		else return 0;
	}else return 0;
}

int main(){
	//freopen("in.in","r",stdin);
	int T;cin>>T;
	while(T--){
		scanf("%d",&n);
		for(int i=0;i<n;i++){
			scanf("%d",&in[i]);
		}
		long long counts=0;
		int r1=0,r2=0;
		for(int l=0;l<n;l++){
			r1=max(l,r1);
			for(;r1<n && add(l,r1,-1)==-1;r1++);
			r1=max(0,r1-1);r2=max(r1+1,r2);
			for(;r2<n && add(l,r2,r2==r1+1?-1:1)!=0;r2++);
			counts+=r2-r1-1;
		}
		printf("%d\n",counts);
		//print(n);
	}
	return 0;
}

28和30过不了,显示读取到负号

2025/8/30 12:11
加载中...