大佬TLE求助
查看原帖
大佬TLE求助
808332
BVVD_FM楼主2023/4/11 12:53
//c++
#include<bits/stdc++.h>
using namespace std;
const int N=5e6+10;
int n,q,cnt;
int a[N],f[N][30],cl[N];
struct node{
	int l,r,sum;// 这个块的左端点,右端点,有几个数 
}st[N];//第几个块 
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}//快读 
int maxx(int l,int r){
	int k=log2(r-l+1);
	return max(f[l][k-1],f[r-(1<<k)+1][k-1]);
}
int Cz(int l,int r){
	int zk,yk,fz=0,fy=0,q=1;
	for(int i=1;i<=cnt;i++){
		if(st[i].l<=l&&st[i].r>=r) return r-l+1;
		if(st[i].l<=l&&st[i].r<r&&fz==0){
			zk=st[i].r-l+1;fz=1;
		} 
		if(st[i].l>l&&st[i].r>=r&&fy==0){
			yk=r-st[i].l+1;fy=1;
		} 
		if(st[i].l>l&&st[i].r<r){
			f[q++][0]=st[i].sum;
		}
	}
	int k=log2(q);
	for(int j=1;j<=k;j++){
		for(int i=1;i+(1<<j)-1<=q;i++){
			f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]);
		}
	}
	return max(max(zk, yk),maxx(1,q));
}
void init(){
	memset(f,0,sizeof f);
	memset(a,0,sizeof a);
	memset(cl,0,sizeof cl);
	memset(st,0,sizeof st);
}
int main(){
	while(1){
		n=read();if(n==0) return 0;
		q=read();
		cnt=0;
		int su=1;
		init();
		for(int i=1;i<=n;i++){
			a[i]=read();
			if(a[i-1]!=a[i]){
				st[cnt].sum=su;
				su=0;
				st[cnt++].r=i-1;
				st[cnt].l=i;	
			} 
			su++;
		}
		st[cnt].r=n;
		st[cnt].sum=su;
		//处理基础信息 
		while(q--){
			int l,r;
			l=read(),r=read();
			printf("%d\n",Cz(l,r));
		}
	}  
	return 0;
}

莫名TLE,孩子已经调傻了

2023/4/11 12:53
加载中...