题目大意

给定一个坐标平面上的NN个点,要为这些点染色,每种点可以染为两种颜色,红色花费为rr,蓝色花费为bb。
现在给出mm个约束条件,每个条件形如:“ ti li di ”“~t_i~l_i~d_i~”表示:
1.如果ti=1ti=1,那么要求x=lix=l_i上所有点红蓝数量之差小于等于did_i
2.如果ti=2ti=2,那么要求y=liy=l_i上所有点红蓝数量之差小于等于did_i

Data Constraint
N,M≤100000N,M ≤ 100000

题解

假设r<br(反过来交换就好)
构造一个二分图,每条垂直于X轴的直线作为一个顶点放在二分图左边,每条垂直于Y轴的直线作为一个顶点放在二分图右边。假如有一个点(x,y)(x,y)我们就从左边的xx向右边的yy连一条边,如果这个点选红色我们就把这条边染为1,否则是0。那么一个约束实际上就是要求一个顶点连出去的所有1边和0边之差小于等于did_i。
不妨设二分图中的一个顶点ii一共连出去qiq_i条边,所有约束中最小值为eie_i,1边有rir_i条。
易得

现在在新增一个源点SS和汇点TT。
SS向每个xx连一条流量为[Lx,Rx][Lx,Rx]的边,每个yy向TT连一条[Ly,Ry][Ly,Ry]的边。对于没有约束的顶点,我们可以人为地添加一个约束来方便连边。中间那些边的流量就设为1。
如果没有可行流,那么就一定是无解。因为r<br
,所以我们要最大化红点的数量,S−>TS->T跑一遍最大流就是我们的答案。

时间复杂度:O(M+Nsqrt(N))O(M+Nsqrt(N))


上下界网络流

这题用到了上下界网络流,我就顺便写一下上下界网络流的简单处理方法。
新增一个超级源SSSS和一个超级汇TTTT。假设我们现在有一条边(u,v)(u,v),流量限制为[L,R][L,R],我们想让有下界的网络流转化成没有下界的网络流模型,怎么做呢?如果我们能强制将下界那么多的流量流过去就好了。具体连边如下:

  • (SS,v)(SS,v)流量为LL
  • (u,TT)(u,TT)流量为RR
  • (u,v)(u,v)流量为R−LR-L
  • (T,S)(T,S)流量为+∞+\infty

这样连边就能保证流量强制流下界的流量。

可行流

从SSSS出发,到TTTT跑一遍最大流,如果最终SSSS所有的出边都流满了,就说明找到了一个满足下界的可行流。

最大流

求完可行流之后,把辅助建图的SSSS和TTTT以及(T,S)(T,S)都删去,再从SS到TT跑一遍最大流。

SRC

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std ;#define N 100000 + 10
#define M 1000000 + 10
typedef long long ll ;
const int inf = 0x7FFFFFFF ;
struct Point {int x , y ;
} P[N] ;map < int  , int  > from[2];bool flag = 0 , bz[M] ;
int Node[2*M] , Next[2*M] , C[2*M] , Head[M] , tot = 1 ;
int vh[M] , h[M] , di[M] , Rec[2*M] ;
int Q[M] , E[M] , ans[N] ;
int n , m , r , b ;
int S , T , SS , TT ;
int MaxFlow , num ;bool cmp( Point a , Point b ) { return a.x < b.x || ( a.x == b.x && a.y < b.y ); }void link( int u , int v , int w ) {Node[++tot] = v , Next[tot] = Head[u] , C[tot] = w , Head[u] = tot ;Node[++tot] = u , Next[tot] = Head[v] , C[tot] = 0 , Head[v] = tot ;
}int SAP( int x , int aug ) {int use = 0 ;if ( x == T ) return aug ;for (int p = di[x] ; p ; p = Next[p] ) {if ( h[x] != h[Node[p]] + 1 || C[p] <= 0 || bz[Node[p]] ) continue ;di[x] = p ;int ret = SAP( Node[p] , min( aug - use , C[p] ) ) ;C[p] -= ret ;C[p^1] += ret ;use += ret ;if ( h[S] > num || aug == use ) return use ;}if ( -- vh[h[x]] == 0 ) { h[S] = num + 1 ; return use ; }h[x] ++ ;vh[h[x]] ++ ;di[x] = Head[x] ;return use ;
}void Flow( int u , int v ) {S = u , T = v ;memset( h , 0 , sizeof(h) ) ;memset( vh , 0 , sizeof(vh) ) ;memcpy( di , Head , sizeof(di) ) ;vh[0] = num = v + 1 ;while ( h[S] <= num ) MaxFlow += SAP( S , inf ) ;S = 0 , T = num - 3 ;
}bool Impossible() {for (int p = Head[SS] ; p ; p = Next[p] ) if ( C[p] ) return 1 ;return 0 ;
}int main() {scanf( "%d%d" , &n , &m ) ;scanf( "%d%d" , &r , &b ) ;int Cnt1 = 0 , Cnt2 = 0 ;for (int i = 1 ; i <= n ; i ++ ) {scanf( "%d%d" , &P[i].x , &P[i].y ) ;if ( !from[0][P[i].x] ) from[0][P[i].x] = ++ Cnt1 ;if ( !from[1][P[i].y] ) from[1][P[i].y] = ++ Cnt2 ;P[i].x = from[0][P[i].x] ;P[i].y = from[1][P[i].y] ;}S = 0 , T = Cnt1 + Cnt2 + 1 ;SS = T + 1 , TT = T + 2 , num = TT + 1 ;for (int i = 1 ; i <= n ; i ++ ) {link( P[i].x , Cnt1 + P[i].y , 1 ) ;Q[P[i].x] ++ , Q[Cnt1+P[i].y] ++ ;Rec[tot-1] = i ;}memset( E , 63 , sizeof(E) ) ;for (int i = 1 ; i <= m ; i ++ ) {int t , l , d ;scanf( "%d%d%d" , &t , &l , &d ) ;if ( from[t-1].find(l) == from[t-1].end() ) continue ;l = from[t-1][l] + (t - 1) * Cnt1 ;E[l] = min( E[l] , d ) ;}for (int i = 1 ; i < T ; i ++ ) {E[i] = min( E[i] , Q[i] ) ;int L = (Q[i] - E[i]) / 2  + (Q[i] - E[i]) % 2 ;int R = (Q[i] + E[i]) / 2 ;if ( L > R ) { printf( "-1\n" ) ; return 0 ; }if ( i <= Cnt1 ) {link( SS , i , L ) ;link( S , TT , L ) ;link( S , i , R - L ) ;} else {link( SS , T , L ) ;link( i , TT , L ) ;link( i , T , R - L ) ;}}link( T , S , inf ) ;Flow( SS , TT ) ;MaxFlow = C[Head[S]] ;if ( Impossible() ) { printf( "-1\n" ) ; return 0 ; }Head[S] = Next[Head[S]] , Head[T] = Next[Head[T]] ;bz[SS] = bz[TT] = 1 ;Flow( S , T ) ;if ( r > b ) swap( r , b ) , flag = 1 ;printf( "%I64d\n" , (ll)MaxFlow * r + (ll)(n - MaxFlow) * b ) ;for (int i = 1 ; i <= Cnt1 ; i ++ ) {for (int p = Head[i] ; p ; p = Next[p] ) {if ( !Rec[p] ) continue ;if ( !C[p] ) ans[Rec[p]] = flag ;else ans[Rec[p]] = !flag ;}}for (int i = 1 ; i <= n ; i ++ ) {if ( ans[i] == 0 ) printf( "r" ) ;else printf( "b" ) ;}return 0 ;
}

以上.

Codeforces 704D Captain America相关推荐

  1. 【Captain America Sentinel of Liberty HD】美国队长:自由哨兵 v1.0.2

    同名电影游戏--美国队长:自由哨兵(Captain America Sentinel of Liberty HD)目前登陆android平台了!这是一款3D动作游戏,游戏中玩家将扮演超级战士美国队长. ...

  2. Codeforces 474C Captain Marmot 给定4个点和各自旋转中心 问旋转成正方形的次数

    题目链接:点击打开链接 题意: 给定T表示case数 以下4行是一个case 每行2个点,u v 每次u能够绕着v逆时针转90° 问最少操作多少次使得4个u构成一个正方形. 思路: 枚举判可行 #in ...

  3. bzoj D. Captain America(TLE)

    题意: 平面上有 n 个点, 第 i 个点的坐标为 (Xi,Yi) ( X i , Y i ) (X_i, Y_i), 你需要把每个点染成红色或者蓝色, 染成红色的花费为 r, 染成蓝色的花费为 b. ...

  4. 【集训队作业】IOI 2020 集训队作业 试题泛做 13

    Codeforces 679E Bear and Bad Powers of 42 不难发现数列中的元素不可能达到很大,我们只需要考虑 424242 的前若干个幂. 考虑没有赋值操作的做法,则可用线段 ...

  5. 别动不动就画折线图了,教你4种酷炫可视化方法

    本文转自『机器之心编译』(almosthuman2014) 散点图.线图.直方图.条形图和箱形图,这些都是简单而强大的可视化方法,通过它们你可以对数据集有深刻的认识.在本文中,我们将看到另外 4 个数 ...

  6. R语言爬取imdb电影海报

    提前声明,这不是一个好的例子,所以不要向我学习.让我先冷静一下! OK,开始,今天我们开始从下面链接爬虫. http://www.imdb.com/search/title?count=100& ...

  7. python做前端可视化_Python数据可视化的四种简易方法

    摘要: 本文讲述了热图.二维密度图.蜘蛛图.树形图这四种Python数据可视化方法. 数据可视化是任何数据科学或机器学习项目的一个重要组成部分.人们常常会从探索数据分析(EDA)开始,来深入了解数据, ...

  8. spring jpa 流式_从响应式Spring Data存储库流式传输实时更新

    spring jpa 流式 这篇文章详细介绍了从数据库到对该数据感兴趣的任何其他组件进行流更新的幼稚实现. 更准确地说,如何更改Spring Data R2DBC存储库以向相关订阅者发出事件. 对R2 ...

  9. 从响应式Spring Data存储库流式传输实时更新

    这篇文章详细介绍了从数据库到对该数据感兴趣的任何其他组件进行流更新的幼稚实现. 更确切地说,如何更改Spring Data R2DBC存储库以向相关订阅者发出事件. 对R2DBC和Spring的一点背 ...

  10. 使用AWS Lambda在Go中构建RESTful API

    在本文中,我们将学习使用AWS Lambda在Go中设计,构建和部署RESTful API. 在开始之前,让我给您简要介绍一下AWS Lambda. 什么是AWS Lambda? AWS Lambda ...

最新文章

  1. python不读第一行和第一列-python 第一个
  2. 2022年预训练的下一步是什么?
  3. QT的QLinkedListIterator类的使用
  4. 从web编辑器 UEditor 中单独提取图片上传,包含多图片单图片上传以及在线涂鸦功能...
  5. matlab 抽样判决代码,matlab抽样判决器
  6. 量子计算机的核心元件简称,计算机文化基础复习题(含答案).doc
  7. Windows环境下32位汇编语言程序设计笔记-基础篇
  8. php在屏幕中间弹窗,屏幕中间弹框的一种写法
  9. 使用AccessibilityService来做一个自动抢红包插件
  10. VUE调用高德地图之热力图
  11. woc,又一个大佬辞职了……
  12. 201871010133-赵永军《面向对象程序设计(java)》第二周学习总结
  13. 20172328 2018-2019《Java软件结构与数据结构》第六周学习总结
  14. ULN2003A驱动12V继电器
  15. 如何用matlab编写分段函数_matlab 如何写分段函数
  16. 从一个表格render方法问题看React函数组件的更新
  17. Packet Tracer 思科模拟器入门教程 之十三 路由器OSPF动态路由配置
  18. cloudera/quickstart
  19. PyTorch中tensor介绍
  20. Notification的功能与使用案例

热门文章

  1. 造DPU芯片,如梦幻泡影?丨虚构短篇小说
  2. I210 网卡设定 force link mode 并关闭 EEE mode
  3. PQ分区魔术师v9.0 中文版
  4. 战队口号霸气押韵8字_当朱广权遇上沙雕网友,押韵狂魔花落谁手?
  5. springboot毕设项目流云医疗管理系统davy2(java+VUE+Mybatis+Maven+Mysql)
  6. html二级菜单:DIV+CSS制作二级菜单(横排二级下拉菜单)以及二级菜单出现错位怎么解决
  7. 微信小程序源码喝酒游戏集合只有前台上传就可以使用
  8. Blue Coat 拓展安全行业最大的加密流量管理协作组织
  9. 计算机教学拼音打字教案,sogo拼音输入法教案.doc
  10. durpal是否支持php7,php – 无法在drupal 7中添加图像字段