求助
查看原帖
求助
759098
tangzirui1016楼主2025/8/29 22:12

样例一不过,实在看不出问题了,问了 AI 也没调出来,麻烦大佬帮忙调一调吧。

#include<bits/stdc++.h>
#define int long long
#define idx(k) (lower_bound(srx+1,srx+totx+1,k)-srx)
#define idy(k) (lower_bound(sry+1,sry+toty+1,k)-sry+totx)
using namespace std;
const int N=3e5+5,INF=1e9;
int n,m,r,b,x[N],y[N],sum[N],h[N];
int srx[N],sry[N],totx,toty;
int op[N],l[N],d[N];
char R='r',B='b';
int head[N],tot,in[N],s,t,SS,TT;
int dep[N],cur[N],outflow,p[N];
struct edge{
	int to,next,c;
}e[N<<3];
void add(int from,int to,int c){
	e[++tot]={to,head[from],c};
	head[from]=tot;
	e[++tot]={from,head[to],0};
	head[to]=tot;
}
bool bfs(int s,int t){
	queue<int>q;
	memset(dep,0,sizeof(dep));
	q.push(s); dep[s]=1;
	while(!q.empty()){
		int tmp=q.front(); q.pop();
		for(int i=head[tmp];i;i=e[i].next){
			int v=e[i].to;
			if(!dep[v]&&e[i].c){
				dep[v]=dep[tmp]+1;
				if(v==t) return true;
				q.push(v);
			}
		}
	}
	return false;
}
int dfs(int u,int mf,int t){
	if(u==t) return mf;
	int sum=0;
	for(int i=cur[u];i;i=e[i].next){
		cur[u]=i;
		int v=e[i].to;
		if(dep[v]==dep[u]+1&&e[i].c){
			int f=dfs(v,min(mf,e[i].c),t);
			e[i].c-=f,e[i^1].c+=f;
			sum+=f,mf-=f;
		}
		if(mf==0) break;
	}
	if(sum==0) dep[u]=0;
	return sum;
}
int dinic(int s,int t){
	int flow=0,res=0;
	while(bfs(s,t)){
		memcpy(cur,head,sizeof(head));
		while(flow=dfs(s,INF,t)) res+=flow;
	}
	return res;
}
signed main(){
	cin>>n>>m>>r>>b;
	if(r>b) swap(r,b),swap(R,B);
	for(int i=1;i<=n;i++){
		cin>>x[i]>>y[i];
		srx[++totx]=x[i],sry[++toty]=y[i];
	}
	for(int i=1;i<=m;i++){
		cin>>op[i]>>l[i]>>d[i];
		if(op[i]==1) srx[++totx]=l[i];
		else sry[++toty]=l[i];
	} 
	sort(srx+1,srx+totx+1); totx=unique(srx+1,srx+totx+1)-srx-1;
	sort(sry+1,sry+toty+1); toty=unique(sry+1,sry+toty+1)-sry-1;
	s=0,t=totx+toty+1,SS=totx+toty+2,TT=totx+toty+3;
	for(int i=1;i<=n;i++){
		int fx=idx(x[i]),fy=idy(y[i]);
		add(fx,fy,1); //[0,1] 不流蓝,流红 
		sum[fx]++,sum[fy]++,p[i]=tot;
	}	
	for(int i=1;i<=totx+toty;i++) h[i]=sum[i];
	for(int i=1;i<=m;i++){
		int fx;
		if(op[i]==1) fx=idx(l[i]);
		else fx=idy(l[i]);
		h[fx]=min(h[fx],d[i]);
	}
	for(int i=1;i<=totx;i++){
		int fx=i;
		int lc=max((sum[fx]-h[fx]+1)/2,0),rc=min((sum[fx]+h[fx])/2,sum[fx]);
		if(lc>rc){
			cout<<-1;
			return 0;
		}
		add(s,fx,rc-lc); //[lc,rc]
		in[fx]+=lc,in[s]-=lc;
	}
	for(int i=1;i<=toty;i++){
		int fx=totx+i;
		int lc=max((sum[fx]-h[fx]+1)/2,0),rc=min((sum[fx]+h[fx])/2,sum[fx]);
		if(lc>rc){
			cout<<-1;
			return 0;
		}
		add(fx,t,rc-lc); //[lc,rc]
		in[t]+=lc,in[fx]-=lc;
	}
	for(int i=s;i<=t;i++){
		if(in[i]>0){
			add(SS,i,in[i]);
			outflow+=in[i];
		} 
		else if(in[i]<0) add(i,TT,-in[i]);
	}
	add(t,s,INF); 
	if(dinic(SS,TT)!=outflow) cout<<-1;
	else{
		int f1=e[tot].c;
		e[tot].c=e[tot^1].c=0;
		int f=f1+dinic(s,t);
		cout<<f*r+(n-f)*b<<'\n';
		for(int i=1;i<=n;i++){
			if(e[p[i]].c) cout<<R;
			else cout<<B;
		}
	}
	return 0;
}
2025/8/29 22:12
加载中...