分别给行和列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. SpringBoot学习笔记(8):事物处理

    SpringBoot学习笔记(8):事物处理 快速入门 在传统的JDBC事务代码开发过程中,业务代码只有一部分,大部分都是与JDBC有关的功能代码,比如数据库的获取与关闭以及事务的提交与回滚.大量的t ...

  2. 序列化组件(get/put/delete接口设计),视图优化组件

    一 . 知识点回顾 1 . 混入类 , 多继承 class Animal(object): def eat(self): print("Eat") def walk(self): ...

  3. 转载:SPFA算法学习

    转载地址:http://www.cnblogs.com/scau20110726/archive/2012/11/18/2776124.html 粗略讲讲SPFA算法的原理,SPFA算法是1994年西 ...

  4. Spring 4.3 的新功能和增强

    转载自https://my.oschina.net/waylau/blog/698186 核心容器改进 核心容器额外提供了更丰富的元数据来改进编程. 默认 Java 8 的方法检测为 bean 属性的 ...

  5. Java丨springMVC + Ajax 来进行分页

    javaweb 分页技术 实现的方式有很多种,但是小编在网上问了度娘也问了谷老师,得到的答案让小编我不是很满意,so,还是自己写吧! 在小编的博文中,小编不会上传源码,只会把重要的代码和思路供大家参考 ...

  6. 【Codeforces】Gym 101608G WiFi Password 二分+线段树

    题意 给定$n$个数,求有最长的区间长度使得区间内数的按位或小于等于给定$v$ 二分区间长度,线段树处理出区间或,对每一位区间判断 时间复杂度$O(n\log n \log n)$ 代码 #inclu ...

  7. COM组件宏观认识

    一直搞不清楚COM到底是个什么东西,记录一些个人感想,可能很多错误的,慢慢消化. 一.宏观认识: 1.COM(组件对象模型)是一种标准,规则,要求,即即于建筑设计指标要求. 2.语言无关性,因为是建立 ...

  8. 【Lintcode】118.Distinct Subsequences

    题目: Given a string S and a string T, count the number of distinct subsequences of T in S. A subseque ...

  9. The specified named connection is either not found in the configuration, not intended to be used

    今天用EF遇到一个问题, The specified named connection is either not found in the configuration, not intended t ...

  10. python set集合的用法

    python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和 ...