分别给行和列hash建两排点,对(x,y)坐标连x行y列的点

设红色价格低,那么就要尽量多选红色

设一个点出度为s,要求最小的最大差值为d,又,假设有流量表示选红没流量表示选蓝,那么要求就变成了这个点的01边差至少为d,列一下式子就是这个点的流入(或者流出)流量可行区间为[(s-d)/2,(s+d)/2]

这样建出图然后跑上下界最大流即可

输出方案就看点对应的边是不是满流

注意有一个不可行情况是最大差为0,并且s为奇数,这个是不可行的但是建图的时候可能会恰好可行所以要提前特判掉

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<queue>
#include<cstring>
using namespace std;
const int N=300005;
int n,m,r,b,x[N],y[N],gx[N],gy[N],s,t,ss,tt,hx,hy,lx[N],ly[N],sx[N],sy[N],ans,sm,w[N],fl,h[N],cnt=1,le[N],d[N];
map<int,int>mpx,mpy;
struct qwe
{
int ne,to,va;
}e[N*30];
int read()
{
int r=0,f=1;
char p=getchar();
while(p<'0'||p>'9')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void add(int u,int v,int w)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
e[cnt].va=w;
h[u]=cnt;
}
void ins(int u,int v,int w)
{//if(w)cerr<<u<<" "<<v<<" "<<w<<endl;
add(u,v,w);
add(v,u,0);
}
void wk(int u,int v,int l,int r)
{
d[u]-=l,d[v]+=l;
ins(u,v,r-l);
}
bool bfs()
{
memset(le,0,sizeof(le));
queue<int>q;
q.push(s);
le[s]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=h[u];i;i=e[i].ne)
if(!le[e[i].to]&&e[i].va)
{
le[e[i].to]=le[u]+1;
q.push(e[i].to);
}
}
return le[t];
}
int dfs(int u,int f)
{
if(u==t||!f)
return f;
int us=0;
for(int i=h[u];i&&us<f;i=e[i].ne)
if(e[i].va&&le[e[i].to]==le[u]+1)
{
int t=dfs(e[i].to,min(e[i].va,f-us));
e[i].va-=t;
e[i^1].va+=t;
us+=t;
}
if(!us)
le[u]=0;
return us;
}
int dinic()
{
int r=0;
while(bfs())
r+=dfs(s,1e9);
return r;
}
int main()
{
n=read(),m=read(),r=read(),b=read();
if(r>b)
swap(r,b),fl=1;
for(int i=1;i<=n;i++)
x[i]=gx[i]=read(),y[i]=gy[i]=read();
sort(gx+1,gx+1+n);
sort(gy+1,gy+1+n);
for(int i=1;i<=n;i++)
if(i==1||gx[i]!=gx[i-1])
mpx[gx[i]]=++hx;
for(int i=1;i<=n;i++)
if(i==1||gy[i]!=gy[i-1])
mpy[gy[i]]=++hy;
for(int i=1;i<=n;i++)
sx[x[i]=mpx[x[i]]]++,sy[y[i]=mpy[y[i]]]++;
for(int i=1;i<=hx;i++)
lx[i]=sx[i];
for(int i=1;i<=hy;i++)
ly[i]=sy[i];
for(int i=1;i<=m;i++)
{
int t=read(),l=read(),d=read();
if(t==1)
l=mpx[l],lx[l]=min(lx[l],d);
else
l=mpy[l],ly[l]=min(ly[l],d);
}
ss=0,tt=hx+hy+1,s=hx+hy+2,t=hx+hy+3;
for(int i=1;i<=n;i++)
{
ins(x[i],y[i]+hx,1);//,cerr<<x[i]<<" "<<y[i]+hx<<endl;
w[i]=cnt-1;
}
for(int i=1;i<=hx;i++)
{
if(!lx[i]&&(sx[i]&1))
{
puts("-1");
return 0;
}
wk(ss,i,(sx[i]-lx[i]+1)/2,(sx[i]+lx[i])/2);
}
for(int i=1;i<=hy;i++)
{
if(!ly[i]&&(sy[i]&1))
{
puts("-1");
return 0;
}
wk(i+hx,tt,(sy[i]-ly[i]+1)/2,(sy[i]+ly[i])/2);
}
for(int i=0;i<=hx+hy+1;i++)
{
if(d[i]>0)
ins(s,i,d[i]),sm+=d[i];
else
ins(i,t,-d[i]);
}
ins(tt,ss,1e9);//cerr<<"OK!"<<endl;
ans=dinic();
if(ans!=sm)
{
puts("-1");
return 0;
}
s=ss,t=tt;
ans=dinic();//cerr<<"OK2"<<endl;
printf("%lld\n",1ll*ans*r+1ll*(n-ans)*b);
for(int i=1;i<=n;i++)
putchar((e[w[i]].va^fl)?'b':'r');
return 0;
}

codeforces704D Captain America【上下界最大流】的更多相关文章

  1. CF#366 704D Captain America 上下界网络流

    CF上的题,就不放链接了,打开太慢,直接上题面吧: 平面上有n个点, 第 i 个点的坐标为 ($X_i ,Y_i$), 你需要把每个点染成红色或者蓝色, 染成红色的花费为 r , 染成蓝色的花费为 b ...

  2. CF704D Captain America 上下界网络流

    传送门 现在相当于说每一个条件都有一个染成红色的盾牌的数量限制\([l,r]\),需要满足所有限制且染成红色的盾牌数量最小/最大. 注意到一个盾牌染成红色对于一行和一列都会产生影响.如果选中一个物品对 ...

  3. HDU 4940 Destroy Transportation system(无源汇有上下界最大流)

    看不懂题解以及别人说的集合最多只有一个点..... 然后试了下题解的方法http://blog.sina.com.cn/s/blog_6bddecdc0102uzka.html 首先是无源汇有上下界最 ...

  4. sgu 176 Flow construction(有源汇的上下界最小流)

    [题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=11025 [模型] 有源汇点的上下界最小流.即既满足上下界又满足 ...

  5. poj2396 Budget(有源汇上下界可行流)

    [题目链接] http://poj.org/problem?id=2396 [题意] 知道一个矩阵的行列和,且知道一些格子的限制条件,问一个可行的方案. [思路] 设行为X点,列为Y点,构图:连边(s ...

  6. 【有源汇上下界费用流】BZOJ 3876 [Ahoi2014]支线剧情

    题目链接: http://www.lydsy.com:808/JudgeOnline/problem.php?id=3876 题目大意: 给定一张拓扑图(有向无环图),每条边有边权,每次只能从第一个点 ...

  7. 【有源汇上下界最大流】ZOJ 3229 Shoot the Bullet

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3229 题目大意: n天给m个女孩拍照(1<=n<= ...

  8. 【无源汇上下界最大流】SGU 194 Reactor Cooling

    题目链接: http://acm.sgu.ru/problem.php?contest=0&problem=194 题目大意: n个点(n<20000!!!不是200!!!RE了无数次) ...

  9. hdu 4940 无源汇有上下界最大流

    /* <img src="http://img.blog.csdn.net/20140823174212937?watermark/2/text/aHR0cDovL2Jsb2cuY3N ...

随机推荐

  1. 如何修改硬盘挂载的名字LABEL

    ➜ ~ df -h Filesystem Size Used Avail Use% Mounted on/dev/sda2 114G 97G 12G 90% /media/brian/4ef34b75 ...

  2. HDU3247 Resource Archiver —— AC自动机 + BFS最短路 + 状压DP

    题目链接:https://vjudge.net/problem/HDU-3247 Resource Archiver Time Limit: 20000/10000 MS (Java/Others)  ...

  3. jquery.dataTables.min.js: Uncaught TypeError: Cannot read property 'style' of undefined

    原因:datatable表格内容有操作列,而表头没有定义操作列 少写了一行:<th>操作</th>

  4. html的head中的常见元素

    <head></head>中有charset, title,link 操作系统默认的字符编码就是gbk. html的加强 (1)<a href="#" ...

  5. Vagrant + Vbox实战 【转】

    原文地址:http://www.cnblogs.com/suihui/p/4362233.html 一.软件下载 1.下载Oracle VM VirtualBox https://www.virtua ...

  6. html5--2.1新的布局元素概述

    html5--2.1新的布局元素概述 学习要点 了解HTML5新标签(元素)的优点 了解本章要学习的新的布局元素 了解本章课程的安排 HTML5新标签的优点: 更注重于内容而不是形式 对人的友好:更加 ...

  7. 使用top命令查看系统状态

    Linux系统可以通过top命令查看系统的CPU.内存.运行时间.交换分区.执行的线程等信息.通过top命令可以有效的发现系统的缺陷出在哪里.是内存不够.CPU处理能力不够.IO读写过高? 使用SSH ...

  8. js图片上传及显示

    html部分: <form action='' method='post' name='myform'> <input type='file' id='iptfileupload' ...

  9. MySQL当月汇总 及负毛利汇总_20161027

    #当月汇总 及负毛利汇总 SELECT e.ID,e.city AS 城市 ,f.当月销售总额,f.当月成本总额,f.当月毛利总额,f.当月优惠券总额,f.当月赠品总额,f.当月毛利总额-f.当月优惠 ...

  10. ACM学习历程——UVA127 "Accordian" Patience(栈, 链表)

    Description  ``Accordian'' Patience  You are to simulate the playing of games of ``Accordian'' patie ...