求助,60分,开O2会MLE4个点,不开会TLE4个点
查看原帖
求助,60分,开O2会MLE4个点,不开会TLE4个点
558299
lzc2006楼主2022/8/18 15:11
#include<bits/stdc++.h>
#define P putchar 
#define G getchar 
using namespace std;

inline void write(int n)
{
    if(n<0){
    	P('-');
		n=-n;
	}
    if(n>9)
		write(n/10);
    P(n%10+'0');
}

inline int R(){
    register int n=0,t=1;
    register char c=G(); 
    while(c<'0'||c>'9'){
        if(c=='-'){
        	t=-1;
		}
        c=G();
    }
    while(c>='0'&&c<='9'){
        n=(n<<1)+(n<<3)+(c^48);  
        c=G();
    }
    return n*t;
}

short W,h,a[1010][1010];
int cut,ans=9999999;
short aa[4][2]={{1,0},{-1,0},{0,1},{0,-1}};

struct node{
	short x,y;
	short d;
	
	bool operator< (const node &m) const{
		return d<m.d;
	} 
};

node p2,p3,p4[1000000];

queue<node> q;

map<node,short> mp1,mp2;

inline void bfs1(){
	while(!q.empty()){
		node w=q.front();
		a[w.x][w.y]=10;
		for(int i=0;i<4;i++){
			int xx=w.x+aa[i][0];
			int yy=w.y+aa[i][1];
			if(xx<1||yy<1||xx>h||yy>W){
				continue;
			} 
			if(a[xx][yy]==0){
				node p;
				p.x=xx;p.y=yy;p.d=w.d+1; 
				q.push(p);
			}
			if(a[xx][yy]==4){
				node p;
				p.x=xx;p.y=yy;p.d=w.d+1;
				mp1[p]=p.d;
				p4[++cut]=p;
			}
		}
		q.pop();
	}
}

inline void bfs2(){
	while(!q.empty()){
		node w=q.front();
		a[w.x][w.y]=1;
		for(int i=0;i<4;i++){
			int xx=w.x+aa[i][0];
			int yy=w.y+aa[i][1];
			if(xx<1||yy<1||xx>h||yy>W){
				continue;
			} 
			if(a[xx][yy]==10||a[xx][yy]==0){
				node p;
				p.x=xx;p.y=yy;p.d=w.d+1; 
				q.push(p);
			}
			if(a[xx][yy]==4){
				node p;
				p.x=xx;p.y=yy;p.d=w.d+1;
				for(int i=1;i<=cut;i++){
					if(p4[i].x==xx&&p4[i].y==yy){
						if(mp2[p4[i]]==0){
							mp2[p4[i]]=p.d;
						    break;
						} 
						else{
							mp2[p4[i]]=min(mp2[p4[i]],p.d);
							break;
						}
					}
				} 
			}
		}
		q.pop();
	}
}

int main(){
	W=R();h=R();
	for(int i=1;i<=h;i++){
		for(int j=1;j<=W;j++){
			a[i][j]=R();
			if(a[i][j]==2){
				p2.x=i;
				p2.y=j;
				p2.d=0;
				q.push(p2);
			}
			if(a[i][j]==3){
				p3.x=i;
				p3.y=j;
				p3.d=0; 
			}
		}
	}
	bfs1();
	q.push(p3);
	bfs2();
	for(int i=1;i<=cut;i++){
		if(mp1[p4[i]]!=0&&mp2[p4[i]]!=0){
			ans=min(ans,mp1[p4[i]]+mp2[p4[i]]);
		}
	}
	write(ans);
	return 0;
} 

代码如上

2022/8/18 15:11
加载中...