蒟蒻10分求调
查看原帖
蒟蒻10分求调
1411905
zhangyuchen201304楼主2024/10/20 21:35

这是代码

#include<bits/stdc++.h>
using namespace std;
short mp[3050][3050];
bool  st[3050][3050];
const int lake=-2,near_lake=0,t=-1,tree=1;
int n,m,q,r,k;
#define In(x,y) (x>0 and x<=n and y>0 and y<=m)
#define PT(x,y,x1,y1) (x==x1 and y==y1)
#define endl '\n'
const int dirx[]= {0,0,1,-1},diry[]= {1,-1,0,0};
const int BIG_DIR_X[]= {-2,-1,-1,-1, 0, 0, 0, 0, 1, 1, 1, 2};
const int BIG_DIR_Y[]= { 0,-1, 0, 1,-2,-1, 1, 2,-1, 0, 1, 0};
struct T {
	int t,x,y;
	T() {
	}
	T(int _t,int _x,int _y) {
		t=_t;
		x=_x;
		y=_y;
	}
};
vector<T>v;
vector<bool>sv;
struct node {
	int x,y;
	node() {
	}
	node(int _x,int _y) {
		x=_x;
		y=_y;
	}
};
queue<node>que;
void bfs() {
	while(!que.empty()) {
		node u=que.front();
		que.pop();
		int x=u.x,y=u.y;
		for(int i=0; i<=3; i++) {
			int dx=x+dirx[i],dy=y+diry[i];
			if(st[dx][dy] and mp[dx][dy]!=tree) {
				que.push({dx,dy});
				mp[dx][dy]=tree;
			}
		}
	}
}
int main() {
	ios::sync_with_stdio(false);
	cout.tie(0);
	cin.tie(0);
	cin>>n>>m>>q>>r>>k;
	memset(mp,t,sizeof(mp));
	while(q--) {
		int x1,y1,x2,y2;
		cin>>x1>>y1>>x2>>y2;
		for(int i=x1; i<=x2; i++)
			for(int j=y1; j<=y2; j++)
				if(In(i,j)) {
					mp[i][j]=lake;
				}
	}
	for(int i=1; i<=n; i++)
		for(int j=1; j<=m; j++)
			if(mp[i][j]==lake)
				for(int k=0; k<=11; k++) {
					int dx=i+BIG_DIR_X[k],dy=j+BIG_DIR_Y[k];
					if(In(dx,dy) and mp[dx][dy]!=lake)mp[dx][dy]=near_lake;
				}
	for(int i=1; i<=n; i++)
		for(int j=1; j<=m; j++)
			if(mp[i][j]==lake)
				for(int k=0; k<=3; k++) {
					int dx=i+dirx[k],dy=j+diry[k];
					if(In(dx,dy) and mp[dx][dy]!=lake)st[dx][dy]=1;
				}
	while(r--) {
		int t,x,y;
		cin>>t>>x>>y;
		if(mp[x][y]==near_lake) {
			mp[x][y]=tree;
			que.push(node(x,y));
		} else v.push_back(T(t,x,y));
	}
	bfs();
	sv.resize(v.size(),0);
	for(int i=0; i<v.size(); i++) {
		bool flag=0;
		if(sv[i]) {
			flag=1;
		} else
			for(int j=i+1; j<v.size(); j++) {
				if(v[j].t-v[i].t>k)break;
				else {
					if(abs(v[i].x-v[j].x)<=1 and abs(v[i].y-v[j].y)<=1
							and abs(v[i].x-v[j].x)+abs(v[i].y-v[j].y)==1) {
						flag=1;
						sv[j]=1;
					}
				}
			}
		if(flag) {
			mp[v[i].x][v[i].y]=tree;
		}
	}
	int cnt=0;
	for(int i=1; i<=n; i++)
		for(int j=1; j<=m; j++)
			if(mp[i][j]==tree)
				++cnt;
	cout<<cnt;
	return 0;
}

实际结果:

1~7、8WA

11、12AC

其余TLE

样例已过

2024/10/20 21:35
加载中...