MLE 怎么改都不行
查看原帖
MLE 怎么改都不行
1030875
born_to_sun楼主2024/3/6 22:09

最后一个点MLE,不知道是为什么,vector有那么占空间吗,哪位大神能来解决一下

#include<bits/stdc++.h>
using namespace std;
const int N=2e6+8;
vector<bool> a[N/2];
long long ans=0;
int n,m;
vector<int> res[N];//0横,1纵
char c[N];
inline void manacher(int n,int d,int op){//横向
	int mid=0,r=0;
	for(int i=1;i<=n*2+2;i++){
		// cout<<"i="<<i<<'\n';
		int dt;
		if(r<i) dt=0;
		else{
			int mir=(mid*2)-i;
			dt=r-i;
			if(op==0) dt=min(dt,res[d][mir]);
			else dt=min(dt,res[mir][d]);
		}
		while(c[i-dt]==c[i+dt]) dt++;
		int to;
		if(op==0) to=res[d][i]=dt-1;
		else to=res[i][d]=dt-1;
		if(i+to>r){
			r=i+to;
			mid=i;
		}
	}
}
vector<bool> vis[N];
int dx[6]={1,0,-1,0};
int dy[6]={0,1,0,-1};
struct node{
	int x,y;
};
inline void bfs(int l,int r,int up,int dn){
	queue<node> q;
	for(int i=l;i<=r;i++){
		for(int j=up;j<=dn;j++){
			if(vis[i][j]||a[i][j]) continue;
			ans++;
			q.push(node{i,j});
			while(!q.empty()){
				int x=q.front().x,y=q.front().y;
				q.pop();
				vis[x][y]=1;
				for(int k=0;k<4;k++){
					int xx=x+dx[k],yy=y+dy[k];
					if(xx<l||yy<up||xx>r||yy>dn) continue;
					if(vis[xx][yy]) continue;
					if(a[xx][yy]) continue;
					vis[xx][yy]=1;
					q.push(node{xx,yy});
				}
			}
		}
	}
}
inline void solve(){
	ans=0;
	int l=1,r=m;
	int up=1,dn=n;
	bool f0;
	c[1]='$';
	c[m*2+2]='#';
	c[m*2+3]='@';
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			c[j*2]='#';
			c[j*2+1]=a[i][j];
		}
		manacher(m,i,0);
	}
	
	for(int j=1;j<=m;j++){
		f0=1;
		for(int i=1;i<=n;i++){
			if(j-res[i][j*2]/2>l){
				f0=0;
				break;
			}
		}
		if(f0){
			l=j;
		}
	}
	for(int j=m;j>l;j--){
		f0=1;
		for(int i=1;i<=n;i++){
			if(j+res[i][j*2]/2-1<r){
				f0=0;
				break;
			}
		}
		if(f0){
			r=j-1;
		}
	}
	for(int i=1;i<=2*n+5;i++){res[i].clear();
		vector<int>().swap(res[i]);
		res[i].resize(m+2);
	}
	c[n*2+2]='#';
	c[n*2+3]='@';
	for(int j=1;j<=m;j++){
		for(int i=1;i<=n;i++){
			c[i*2]='#';
			c[i*2+1]=a[i][j]+'0';
		}
		manacher(n,j,1);
	}
	for(int i=1;i<=n;i++){
		f0=1;
		for(int j=1;j<=m;j++){
			if(i-res[i*2][j]/2>up){
				f0=0;
				break;
			}
		}
		if(f0){
			up=i;
		}
	}
	for(int i=n;i>up;i--){
		f0=1;
		for(int j=1;j<=m;j++){
			if(i+res[i*2][j]/2-1<dn){
				f0=0;
				break;
			}
		}
		if(f0){
			dn=i-1;
		}
	}
	for(int i=1;i<=n*2+5;i++){
		res[i].clear();
		vector<int>().swap(res[i]);
	}
	// cout<<"border= "<<l<<' '<<r<<' '<<up<<' '<<dn<<'\n';
	bfs(up,dn,l,r);
}
int main(){
	int T;
	cin>>T;
	while(T--){
		cin>>n>>m;
		for(int i=1;i<=n;i++){
			a[i].resize(m+2);
			vis[i].resize(m+2);
			res[i].resize(2*m+5);
		}
		
		char ccc[N];
		for(int i=1;i<=n;i++){
			cin>>ccc+1;
			for(int j=1;j<=m;j++) a[i][j]=ccc[j]-'0';
		}
		
		solve();
		cout<<ans<<'\n';
		for(int i=1;i<=n;i++){
			a[i].clear();
			vis[i].clear();
			vector<bool>().swap(a[i]);
			vector<bool>().swap(vis[i]);
		}
		
	}
	
	return 0;
}
2024/3/6 22:09
加载中...