P7809 样例没过,求助,玄关
查看原帖
P7809 样例没过,求助,玄关
1028523
nQAQn楼主2025/8/5 12:05

rt

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e6+5;
int n,m;
int arr[N];
int qz0[N],qz1[N];
int f[N][50],lg[N];
int ans(int l,int r){
	int k=lg[r-l+1];
	return max(f[l][k],f[r-(1<<k)+1][k]);
}
int main(){
//	freopen("xxx.in","r",stdin);
//	freopen("xxx.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&arr[i]);
		if(arr[i]==0){
			qz0[i]=qz0[i-1]+1;
			qz1[i]=qz1[i-1];
		}else if(arr[i]==1){
			qz1[i]=qz1[i-1]+1;
			qz0[i]=qz0[i-1];
		}
	}
	for(int i=0;i<=n;i++){
		f[i][0]=qz0[i]-qz1[i];
	}
	lg[0]=-1;
    for(int i=1;i<=n;i++){
        lg[i]=lg[i>>1]+1;
    }
    for(int k=1;k<=lg[n];k++){
    	for(int i=0;i+(1<<k)-1<=n;i++){
    		f[i][k]=max(f[i][k-1],f[i+(1<<(k-1))][k-1]);
		}
	}
	int op,l,r;
	while(m--){
		scanf("%d%d%d",&op,&l,&r);
		if(op==1){
			printf("%d\n",qz1[r]-qz0[l-1]+ans(l-1,r));
		}else if(op==2){
			int a=qz0[r]-qz0[l-1],b=qz1[r]-qz1[l-1];
			if(a>0&&b>0){
                printf("2\n");
            }else{
                printf("1\n");
            }
		}
	}
	return 0;
} 
2025/8/5 12:05
加载中...