离谱,居然卡过了
查看原帖
离谱,居然卡过了
1173402
yfhshtk楼主2023/10/29 11:06

求问各位大佬,这个代码在洛谷上跑了9.34s,时间限制1s,但是开不开O2都能A,求问这是为什么


#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e4+5;
inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			w=(~w)+1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		s=(s<<3)+(s<<1)+(ch&15);
		ch=getchar();
	}
	return s*w;
}
inline void write(int x){
	if(x<0){
		putchar('-');
		x=(~x)+1;
	}
	if(x>9){
		write(x/10);
	}
	putchar(x%10|48);
}
int T,ca,cb,n;
bool vis[MAXN][MAXN];
struct node{
	int x,y;
	vector<int> adj;
};
void bfs(){
	memset(vis,0,sizeof(vis));
	queue<node>q;
	node tmp;
	tmp.x=0,tmp.y=0;
	vis[0][0]=1;
	q.push(tmp);
	while(!q.empty()){
		node now=q.front();
		q.pop();
		if(now.y==n){
			cout<<now.adj.size()<<' ';
			for(auto &i : now.adj){
				cout<<i<<' ';
			}
			cout<<endl;
			return ;
		}
		for(int i=1;i<=6;i++){
			tmp=now;
			if(i==1){
				if(now.x!=ca){
					if(!vis[ca][now.y]){
						tmp.x=ca;
						tmp.adj.push_back(i);
						vis[tmp.x][tmp.y]=1;
						q.push(tmp);
					}
				}
			}
			else if(i==2){
				if(now.y!=cb){
					if(!vis[now.x][cb]){
						tmp.y=cb;
						tmp.adj.push_back(i);
						vis[tmp.x][tmp.y]=1;
						q.push(tmp);
					}
				}
			}
			else if(i==3){
				if(now.x!=0){
					if(!vis[0][now.y]){
						tmp.x=0;
						tmp.adj.push_back(i);
						vis[tmp.x][tmp.y]=1;
						q.push(tmp);
					}
				}
			}
			else if(i==4){
				if(now.y!=0){
					if(!vis[now.x][0]){
						tmp.y=0;
						tmp.adj.push_back(i);
						vis[tmp.x][tmp.y]=1;
						q.push(tmp);
					}
				}
			}
			else if(i==5){
				if(now.y){
					if(ca-now.x>=now.y&&!vis[now.x+now.y][0]){
						tmp.x+=now.y;
						tmp.y=0;
						tmp.adj.push_back(i);
						vis[tmp.x][tmp.y]=1;
						q.push(tmp);
					}
					else if(ca-now.x<now.y&&!vis[ca][now.y-ca+now.x]){
						tmp.x=ca;
						tmp.y-=(ca-now.x);
						tmp.adj.push_back(i);
						vis[tmp.x][tmp.y]=1;
						q.push(tmp);
					}
				}
			}
			else{
				if(now.x){
					if(cb-now.y>=now.x&&!vis[0][now.y+now.x]){
						tmp.y+=now.x;
						tmp.x=0;
						tmp.adj.push_back(i);
						vis[tmp.x][tmp.y]=1;
						q.push(tmp);
					}
					else if(cb-now.y<now.x&&!vis[now.x-cb+now.y][cb]){
						tmp.y=cb;
						tmp.x-=(cb-now.y);
						tmp.adj.push_back(i);
						vis[tmp.x][tmp.y]=1;
						q.push(tmp);
					}
				}
			}
		}
	}
	return ;
}
int main(){
	std::ios::sync_with_stdio(false);
	T=read();
	while(T--){
		ca=read(),cb=read(),n=read();
		bfs();
	}
	return 0;
}
2023/10/29 11:06
加载中...