社区讨论

萌新求助 abc g

学术版参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mlmf3nnv
此快照首次捕获于
2026/02/14 22:34
5 天前
此快照最后确认于
2026/02/18 21:25
16 小时前
查看原帖
rt,TLE *21。
CPP
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N = 305;
vector<int> g2[N * N],g3[N * N];
bool vis[N * N],vis2[N * N],vis3[N * N],vis4[N * N];
map<pair<int,int>,int> mp;
int n,a,b,xx[4] = {1,-1,1,-1},yy[4] = {1,1,-1,-1},num[N * N],s,t;
char s2[N][N];
template<int N,int M>
struct MaxFlow{
	int head[N],thead[N],cnt = 1,n,dis[N];
	struct node{int u,v,w,nxt;}e[M << 1];
	queue<int> q;
	void clear(){cnt = 1;while(n)head[n--] = 0;}
	void save(int u,int v,int w){n = max({n,u,v});e[++cnt] = {u,v,w,head[u]},head[u] = cnt;if(u != s && u != t && v != s && v != t)g2[u].push_back(v);}
	void add(int u,int v,int w){save(u,v,w),save(v,u,0);}
	bool test(int x){return !e[x * 2].w;} 
	bool bfs(int s,int t){
		memset(dis,-1,sizeof(int) * (n + 1));
		dis[s] = 0;while(!q.empty())q.pop();q.push(s);
		while(!q.empty()){
			int u = q.front();q.pop();
            if(u == t)break;
			for(int i = head[u];i;i = e[i].nxt){
				int v = e[i].v,w = e[i].w;
				if(w && dis[v] == -1)dis[v] = dis[u] + 1,q.push(v);
			}
		}
		for(int i = 1;i <= n;i++)thead[i] = head[i];
		return ~dis[t];
	}
	int dfs(int u,int flow,int t){
		if(u == t)return flow;
		int lst = flow;
		for(int &i = thead[u];i;i = e[i].nxt){
            if(!lst)continue;
			int v = e[i].v,w = e[i].w;
			if(dis[u] + 1 == dis[v] && w){
				int tmp = dfs(v,min(lst,w),t);
				e[i].w -= tmp,e[i ^ 1].w += tmp,lst -= tmp;
			}
		}
		return flow - lst;
	}
	int flow(int s,int t){
		int ans = 0;
		while(bfs(s,t))ans += dfs(s,(int)(1e15),t);
		return ans;
	}
};
MaxFlow<N * N,N * N * 11> g;
void dfs(int u,int now = 0){
	if(vis[u])return;
	vis[u] = true;
	//cout << u << endl;
	for(auto v : g2[u]){
		if(mp.count(make_pair(u,v)) == now)dfs(v,now ^ 1);//,cout << u << "->" << v << endl;
	}
}
void dfs2(int u){
	if(vis4[u])return;
	vis4[u] = true;
	for(auto v : g3[u]){
		num[v] = num[u] ^ 1;
		dfs2(v);
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> a >> b;
	for(int i = 1;i <= n;i++){
		for(int j = 1;j <= n;j++){
			for(int k = 0;k < 4;k++){
				int tx = i + xx[k] * a,ty = j + yy[k] * b;
				if(tx < 1 || tx > n || ty < 1 || ty > n)continue;
				g3[(i - 1) * n + j].push_back((tx - 1) * n + ty);
			}
			for(int k = 0;k < 4;k++){
				int tx = i + xx[k] * b,ty = j + yy[k] * a;
				if(tx < 1 || tx > n || ty < 1 || ty > n)continue;
				g3[(i - 1) * n + j].push_back((tx - 1) * n + ty);
			}
		}
	} 
	for(int i = 1;i <= n * n;i++){
		if(!vis4[i])dfs2(i);
	}
	s = n * n + 1,t = n * n + 2;
	for(int i = 1;i <= n;i++){
		for(int j = 1;j <= n;j++){
			cin >> s2[i][j];
		}
	}
	for(int i = 1;i <= n;i++){
		for(int j = 1;j <= n;j++){
			int p = (i - 1) * n + j;
//			cout << p << " " << num[p] << endl;
			if(s2[i][j] == '.'){
				if(!num[p])g.add(s,p,1);
				else g.add(p,t,1);
				for(int k = 0;k < 4;k++){
					int tx = i + xx[k] * a,ty = j + yy[k] * b;
					if(tx < 1 || tx > n || ty < 1 || ty > n)continue;
					if(!(i < tx || (i == tx && j < ty)))continue;
					if(s2[tx][ty] == '#')continue;
					assert(num[p] != num[(tx - 1) * n + ty]);
					if(num[p])g.add((tx - 1) * n + ty,p,1);
					else g.add(p,(tx - 1) * n + ty,1);
				}
				for(int k = 0;k < 4;k++){
					int tx = i + xx[k] * b,ty = j + yy[k] * a;
					if(tx < 1 || tx > n || ty < 1 || ty > n)continue;
					if(!(i < tx || (i == tx && j < ty)))continue;
					if(s2[tx][ty] == '#')continue;
					assert(num[p] != num[(tx - 1) * n + ty]);
					if(num[p])g.add((tx - 1) * n + ty,p,1);
					else g.add(p,(tx - 1) * n + ty,1);
				}
			}
		}
	}
//	cout << g.flow(s,t) << endl;
	g.flow(s,t);
	for(int i = 1;i <= n * n;i++){
		if(!num[i])vis3[i] = true;
	}
	for(int i = 2;i <= g.cnt;i++){
		if(i % 2 == 0 && !g.e[i].w){
			if(g.e[i].u == s)vis3[g.e[i].v] = false;
			else if(g.e[i].v != t)mp[{g.e[i].u,g.e[i].v}] = mp[{g.e[i].v,g.e[i].u}] = true;//,cout << g.e[i].u << " " << g.e[i].v << endl;
		}
	}
	for(int i = 1;i <= n;i++){
		for(int j = 1;j <= n;j++){
			if(vis3[(i - 1) * n + j] && !vis[(i - 1) * n + j])dfs((i - 1) * n + j);
		}
	}
	for(int i = 1;i <= n;i++){
		for(int j = 1;j <= n;j++){
			if(s2[i][j] == '.'){
				//cout << i << " " << j << " " << num[(i - 1) * n + j] << " " << vis[(i - 1) * n + j] << endl;
			}
		}
	}
	for(int i = 1;i <= n;i++){
		for(int j = 1;j <= n;j++){
			if(s2[i][j] == '#')cout << "#";
			else if(s2[i][j] == '.'){
				cout << ((num[(i - 1) * n + j] && vis[(i - 1) * n + j]) || (!num[(i - 1) * n + j] && !vis[(i - 1) * n + j]) ? '.' : 'o');
			}
		}
		cout << endl;
	}
}
按理来说这个代码不会 TLE 啊?
ps:可以确定是 dinic 爆炸了。

回复

5 条回复,欢迎继续交流。

正在加载回复...