社区讨论

RE on 8 求助 QwQ

P4313文理分科参与者 1已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mdgz0dka
此快照首次捕获于
2025/07/24 13:47
7 个月前
此快照最后确认于
2025/11/04 03:49
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
using namespace std;
namespace flow{
	#define LL long long
	#define sz(a) int((a).size())
	#define mem(a,x,n) memset(a,x,sizeof(*a)*(n+2))
	#define pb emplace_back
	const int N = 101*101*3+2+1;
	int fn,S,T; int head[N]; int dis[N];
	struct Edge{
		int to,b; LL c;
		Edge(int to=0,int b=0,LL c=0):to(to),b(b),c(c){}
	}; vector<Edge> e[N]; 
	void init(int n=0){S=n+1,T=fn=n+2;}
	void addedge(int u,int v,LL w=1e18){e[u].pb(v,sz(e[v]),w);e[v].pb(u,sz(e[u])+1,0);}
	bool bfs(){
		static int l,r,q[N];
		mem(head,0,fn); mem(dis,0,fn);
		dis[S]=1; q[l=r=1]=S;
		while(l<=r){
			int u=q[l++];
			for(auto ele : e[u]){
				int v=ele.to,b=ele.b; LL c=ele.c;
				if(c and !dis[v])
					{dis[v]=dis[u]+1; q[++r]=v; if(v==T) return 1;}
			}
		}
		return 0;
	}
	LL dfs(int u,LL in){
		if(u==T) return in;
		LL out=0;
		for(int &i=head[u];i<sz(e[u]);++i){
			auto ele=e[u][i];
			int v=ele.to,b=ele.b; LL c=ele.c;
			if(c and dis[v]==dis[u]+1){
				if(LL f = dfs(v,min(c,in-out))){
					e[u][i].c-=f; e[v][b].c+=f;
					if((out+=f)==in) return in;
				}else dis[v]=0;
			}
		}
		return out;
	}
	LL Dinic(){LL res=0; while(bfs())res+=dfs(S,1e18); return res;}
}using flow::fn;using flow::S;using flow::T;using flow::addedge;

const int N = 101;
int n,m;
int art[(N+1)][(N+1)];
int sci[(N+1)][(N+1)];
int same_art[(N+1)][(N+1)];
int same_sci[(N+1)][(N+1)];
int tot;
int point[(N+1)][(N+1)];
int pit_art[(N+1)][(N+1)];
int pit_sci[(N+1)][(N+1)];
int xx[] = {0,0,1,0,-1};
int yy[] = {0,1,0,-1,0};
bool vis[(N+1)+1][(N+1)+1];
signed main(){
//	std::ios::sync_with_stdio(false);
//	std::cin.tie(0);
	LL ans=0;
	cin>>n>>m;
	rep(i,1,n) rep(j,1,m) cin>>art[i][j],ans+=art[i][j];
	rep(i,1,n) rep(j,1,m) cin>>sci[i][j],ans+=sci[i][j];
	rep(i,1,n) rep(j,1,m) cin>>same_art[i][j],ans+=same_art[i][j];
	rep(i,1,n) rep(j,1,m) cin>>same_sci[i][j],ans+=same_sci[i][j];
	rep(i,1,n) rep(j,1,m) point[i][j]=++tot;
	rep(i,1,n) rep(j,1,m) pit_art[i][j]=++tot;
	rep(i,1,n) rep(j,1,m) pit_sci[i][j]=++tot;
	flow::init(tot);
	rep(i,1,n) rep(j,1,m) addedge(S,point[i][j],art[i][j]),addedge(S,pit_art[i][j],same_art[i][j]);
	rep(i,1,n) rep(j,1,m) addedge(point[i][j],T,sci[i][j]),addedge(pit_sci[i][j],T,same_sci[i][j]);
	rep(i,1,n) rep(j,1,m) vis[i][j]=1;
	rep(i,1,n) rep(j,1,m) rep(k,0,4)
		{int tx=i+xx[k],ty=j+yy[k]; if(vis[tx][ty]) addedge(pit_art[i][j],point[tx][ty]);}
	rep(i,1,n) rep(j,1,m) rep(k,0,4)
		{int tx=i+xx[k],ty=j+yy[k]; if(vis[tx][ty]) addedge(point[tx][ty],pit_sci[i][j]);}
	ans = ans - flow::Dinic();
	cout<<ans<<"\n";
}

回复

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

正在加载回复...