[Aizu1410]Draw in Straight Lines
注意到当操作确定后,显然操作顺序总是涂黑色的1操作->涂白色的1操作->2操作
用$b/w_{r/c}(i,j)$表示$(i,j)$是否被黑色/白色 横着/竖着 涂过(1表示涂过,0表示没有),注意到当这些信息被确定后,已经可以确定是否可行以及对应的代价
具体的,考虑一个格子$(i,j)$,对其进行分析——
注意到$b_{r}(i,j)=w_{r}(i,j)=1$一定不优秀(严格,$c$类似),证明对其分三类讨论:
1.若对应的两次操作不相互包含,则可以缩短黑色操作
2.若其中白色操作包含黑色,则可以直接去掉黑色操作
3.若其中黑色操作包含白色操作,则可以将黑色操作拆成两段并去掉白色操作(注意到白色操作覆盖的段已经被涂两次,不会再有别的操作)
根据此性质,再对其颜色分类讨论:
1.若其要求最终为黑色,则要求$w_{r}(i,j)=w_{c}(i,j)=0$,并且若$b_{r}(i,j)=b_{c}(i,j)=0$则还要用2操作涂黑(即额外产生$c$的代价),另外显然其一定不会被涂超过2次
2.若其要求最终为白色,根据之前的性质即要求$b_{r}(i,j)\and b_{c}(i,j)=0$,并且若$b_{r}(i,j)=1$且$w_{c}(i,j)=0$(或$b_{c}(i,j)=1$且$w_{r}(i,j)=0$)则还要用1操作涂白
另外,还要求1操作的代价,关于$a$即每一个格子会产生$\sum b/w_{r/c}(i,j)$个$a$的代价,关于$b$考虑操作的起点,也即对于$b_{r}(i,j)=1$且$b_{r}(i,j-1)=0$($w$和$c$类似)的格子会再产生$b$的代价
关于这个问题,容易想到最小割,下面描述建图——
对每一个$b/w_{r/c}(i,j)$建立一个点,从$S$向$b_{r}/w_{c}(i,j)$连边$,b_{c}/w_{r}(i,j)$向$T$连边(边权均为$a$,即割表示对应的值选1),进而在这个基础结构上,依次考虑上面的限制和代价:
1.要求$b_{r}(i,j)$和$w_{r}(i,j)$($c$类似)不同时为1,那么从$w_{r}(i,j)$向$b_{r}(i,j)$连一条边权为$\infty$的边即可
2.要求最终为黑色的点$w_{r}(i,j)=w_{c}(i,j)=0$,那么从$w_{r/c}(i,j)$再向$T$连一条边权为$\infty$的边即可
3.若最终为黑色的点$b_{r}(i,j)=b_{c}(i,j)=0$则产生$c$的代价,那么从$b_{r}(i,j)$向$b_{c}(i,j)$连一条边权为$c$的边即可
4.要求最终为白色的点$b_{r}(i,j)\and b_{c}(i,j)=0$,那么从$b_{c}(i,j)$向$b_{r}(i,j)$连一条边权为$\infty$的边即可
5.若最终为白色的点$b_{r}(i,j)=1$且$w_{c}(i,j)=0$(另一种类似)则产生$c$的代价,那么从$w_{c}(i,j)$向$b_{r}(i,j)$连一条边权为$c$的边,注意到若$b_{r}(i,j)$没被割掉或$w_{c}(i,j)$被割掉该边显然不需要被割掉,同时当两者均不成立时(即所要求的情况)则$b_{r}(i,j)$必然存在一条路径,进而即会要求其被割掉
6.若$b_{r}(i,j)=1$且$b_{r}(i,j-1)=0$则产生$b$的代价($w$和$c$类似),那么从$b_{r}(i,j-1)$向$b_{r}(i,j)$连一条边权为$b$的边,正确性与5类似(特别的,还需要从$S$再向$b_{r}(i,1)$连一条边权为$b$的边)

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 45
4 #define maxV N*N*4
5 #define maxE N*N*30
6 #define oo 0x3f3f3f3f
7 struct Edge{
8 int nex,to,len;
9 }edge[maxE];
10 queue<int>q;
11 int n,m,V,E,a,b,c,ans,br[N][N],bc[N][N],wr[N][N],wc[N][N],head[maxV],work[maxV],d[maxV];
12 char s[N][N];
13 void add(int x,int y,int z){
14 edge[E]=Edge{head[x],y,z};
15 head[x]=E++;
16 if (E&1)add(y,x,0);
17 }
18 bool bfs(){
19 memset(d,oo,sizeof(d));
20 d[0]=0,q.push(0);
21 while (!q.empty()){
22 int k=q.front();
23 q.pop();
24 for(int i=head[k];i!=-1;i=edge[i].nex)
25 if ((edge[i].len)&&(d[edge[i].to]==oo)){
26 d[edge[i].to]=d[k]+1;
27 q.push(edge[i].to);
28 }
29 }
30 return d[V]!=oo;
31 }
32 int dfs(int k,int s){
33 if (k==V)return s;
34 int ans=0;
35 for(int &i=head[k];i!=-1;i=edge[i].nex)
36 if ((edge[i].len)&&(d[edge[i].to]==d[k]+1)){
37 int p=dfs(edge[i].to,min(s,edge[i].len));
38 edge[i].len-=p,edge[i^1].len+=p,s-=p,ans+=p;
39 if (!s)return ans;
40 }
41 return ans;
42 }
43 int main(){
44 scanf("%d%d%d%d%d",&n,&m,&a,&b,&c);
45 for(int i=1;i<=n;i++)scanf("%s",s[i]+1);
46 for(int i=1;i<=n;i++)
47 for(int j=1;j<=m;j++){
48 br[i][j]=++V,bc[i][j]=++V;
49 wr[i][j]=++V,wc[i][j]=++V;
50 }
51 V++;
52 memset(head,-1,sizeof(head));
53 for(int i=1;i<=n;i++)
54 for(int j=1;j<=m;j++){
55 add(0,br[i][j],a),add(0,wc[i][j],a);
56 add(bc[i][j],V,a),add(wr[i][j],V,a);
57 add(wr[i][j],br[i][j],oo);
58 add(bc[i][j],wc[i][j],oo);
59 if (s[i][j]=='#'){
60 add(wr[i][j],V,oo),add(0,wc[i][j],oo);
61 add(br[i][j],bc[i][j],c);
62 }
63 else{
64 add(bc[i][j],br[i][j],oo);
65 add(wc[i][j],br[i][j],c);
66 add(bc[i][j],wr[i][j],c);
67 }
68 if (j==1)add(0,br[i][j],b),add(wr[i][j],V,b);
69 else add(br[i][j-1],br[i][j],b),add(wr[i][j],wr[i][j-1],b);
70 if (i==1)add(bc[i][j],V,b),add(0,wc[i][j],b);
71 else add(bc[i][j],bc[i-1][j],b),add(wc[i-1][j],wc[i][j],b);
72 }
73 memcpy(work,head,sizeof(head));
74 while (bfs()){
75 ans+=dfs(0,oo);
76 memcpy(head,work,sizeof(head));
77 }
78 printf("%d\n",ans);
79 return 0;
80 }
[Aizu1410]Draw in Straight Lines的更多相关文章
- CF961D Pair Of Lines
题目描述 You are given n n n points on Cartesian plane. Every point is a lattice point (i. e. both of it ...
- CodeForces - 961D:Pair Of Lines (几何,问两条直线是否可以覆盖所有点)
You are given n points on Cartesian plane. Every point is a lattice point (i. e. both of its coordin ...
- Codeforces 961 D Pair Of Lines
题目描述 You are given nn points on Cartesian plane. Every point is a lattice point (i. e. both of its c ...
- Educational Codeforces Round 41 (Rated for Div. 2) D. Pair Of Lines (几何,随机)
D. Pair Of Lines time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- Educational Codeforces Round 41 (Rated for Div. 2) ABCDEF
最近打的比较少...就只有这么点题解了. A. Tetris time limit per test 1 second memory limit per test 256 megabytes inpu ...
- [Swift]LeetCode1035.不相交的线 | Uncrossed Lines
We write the integers of A and B (in the order they are given) on two separate horizontal lines. Now ...
- 快速切题 sgu135. Drawing Lines
135. Drawing Lines time limit per test: 0.25 sec. memory limit per test: 4096 KB Little Johnny likes ...
- codeforces 872E. Points, Lines and Ready-made Titles
http://codeforces.com/contest/872/problem/E E. Points, Lines and Ready-made Titles time limit per te ...
- 【leetcode】1035. Uncrossed Lines
题目如下: We write the integers of A and B (in the order they are given) on two separate horizontal line ...
随机推荐
- JavaScript数组 几个常用方法
前言 数组方法有太多了,本文记录一些本人容易记错的一些数组方法,用于巩固及复习. 后续会慢慢的将其他数组方法添加进来. 善用数组方法可以使数据处理变的优雅且简单. 那下面让我们开始吧: filter( ...
- NOIP 模拟 七十七
100+60+95+30; T4 一个变量打错挂了40.. T1 最大或 考虑从高到低枚举的二进制位,然后和的对应二进制位进行比较.如果两 者相同,那么不论怎么选择,,答案在这个位置上的值一定和在这个 ...
- SpringCloud升级之路2020.0.x版-28.OpenFeign的生命周期-进行调用
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 接下来,我们开始分析 OpenFeign 同步环境下的生命周期的第二部分,使用 Synch ...
- Netty 组件分析
EventLoop 事件循环对象 EventLoop 本质是一个单线程执行器(同时维护了一个 Selector),里面有 run 方法处理 Channel 上源源不断的 io 事件. 它的继承关系比较 ...
- Coursera Deep Learning笔记 结构化机器学习项目 (上)
参考:https://blog.csdn.net/red_stone1/article/details/78519599 1. 正交化(Orthogonalization) 机器学习中有许多参数.超参 ...
- Alpha发布声明
项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 Alpha-发布声明 我们是谁 删库跑路对不队 我们在做什么 题士 进度如何 进度总览 一.功能与特性 1. ...
- [Beta]the Agiles Scrum Meeting 10
会议时间:2020.5.25 21:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 issue yjy 暂无 tq 暂无 wjx 实现创建.显示博客作业功能 增加博客作业功能 dzx 实 ...
- OO第四单元及学期总结
OO第四单元及学期总结 第四单元两次作业的架构设计 第一次作业 类图: 树形结构:使用Operation类管理UMLOperation以及parent为该UMLOperation的参数(UMLpara ...
- 2020BUAA软工提问回顾和个人总结作业
2020BUAA软工提问回顾和个人总结作业 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾和个人总结作业 我在 ...
- (三)、Docker常用基础命令
1.Docker 帮助命令 帮助命令: docker version 查看版本 docker info 查询docker详细信息 docker --help 查看命令帮助 2.Docker 镜像命令 ...