样例一不过,实在看不出问题了,问了 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;
}