请问这个程序要怎么优化才能不超时啊
查看原帖
请问这个程序要怎么优化才能不超时啊
303105
haiming楼主2023/10/16 17:54
#include<bits/stdc++.h>
using namespace std;
int n,i,t,x,y,s,a[201000],b[201000],c[201000],f[201000],g[201000];
void read(int &x){
	int f=0;char ch=getchar();x=0;
	while(ch>'9'||ch<'0'){if(ch=='-')f=1;ch=getchar();}
	while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
	if(f)x=-x;
}
int find(int x){
	if(c[x]==0)return x;
	return f[x]=find(f[x]);
}
int find1(int x){
	if(c[x]==0)return x;
	return g[x]=find(g[x]);
}
int main(){
//	freopen("fruit.in","r",stdin);
//	freopen("fruit.out","w",stdout);
	scanf("%d",&n); a[0]=-1;f[0]=1;
	for(i=1;i<=n;i++){
		read(a[i]);
		f[i]=i+1;g[i]=i-1;
		if(a[i]!=a[i-1]){
			b[++t]=i;
		}
	}
	while(s<n){
		for(i=1;i<=t;i++)
			printf("%d ",b[i]),c[b[i]]=1,s++,f[b[i]-1]=f[b[i]],g[b[i]+1]=g[b[i]];
		putchar(10);
		for(i=1;i<=t;i++){
			x=find1(g[b[i]]);
			y=find(f[b[i]]);
			f[x]=max(f[x],y);
			g[y]=min(g[y],x);
		}
		t=0;
		for(i=find(f[0]);i<=n;i=f[i])
			if(a[g[i]]!=a[i])b[++t]=i;
	}
	
	return 0;
}
2023/10/16 17:54
加载中...