BZOJ 4823 [Cqoi2017]老C的方块 ——网络流
lrd的题解:http://www.cnblogs.com/liu-runda/p/6695139.html
我还是太菜了。以后遇到这种题目应该分析分析性质的。
网络流复杂度真是$O(玄学)$
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define inf 0x3f3f3f3f
#define ll long long
#define mp make_pair
#define maxn 500005 int mov[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int h[maxn],to[maxn],ne[maxn],fl[maxn],en=0,n,m,k;
int S=maxn-2,T=maxn-1,dis[maxn];
queue <int> q;
map <pair<int,int>,int> Link; void add(int a,int b,int c)
{
to[en]=b;ne[en]=h[a];fl[en]=c;h[a]=en++;
to[en]=a;ne[en]=h[b];fl[en]=0;h[b]=en++;
} bool tell()
{
memset(dis,-1,sizeof dis); dis[S]=0; q.push(S);
while (!q.empty())
{
int x=q.front(); q.pop();
for (int i=h[x];i>=0;i=ne[i])
if (dis[to[i]]==-1&&fl[i]>0){
dis[to[i]]=dis[x]+1;
q.push(to[i]);
}
}
return dis[T]!=-1;
} int zeng(int k,int now)
{
if (k==T) return now;
int ret=0;
for (int i=h[k];i>=0&&ret<now;i=ne[i])
if (dis[to[i]]==dis[k]+1&&fl[i]>0)
{
int tmp=zeng(to[i],min(fl[i],now-ret));
fl[i]-=tmp;fl[i^1]+=tmp;ret+=tmp;
}
if (!ret) dis[k]=-1;
return ret;
} int dinic()
{
int ret=0,tmp;
while (tell()) while (tmp=zeng(S,inf)) ret+=tmp;
return ret;
} int x[maxn],y[maxn],w[maxn]; bool isgreen(int x,int y)
{
int tmp=(x>>1)&1;
if (tmp) return ((x+y)&1);
else return (!((x+y)&1));
} bool isblue(int x,int y)
{if ((!isgreen(x,y))&&(!((x>>1)&1))) return true;return false;} bool isred(int x,int y)
{if ((!isgreen(x,y))&&(!isblue(x,y))) return true;return false;} bool leftgreen(int x,int y)
{return (isgreen(x,y))&&(isred(x,y+1))&&(isgreen(x+1,y));} bool rightgreen(int x,int y)
{return (isgreen(x,y))&&(isred(x,y+1))&&(isgreen(x-1,y));} void Finout()
{
freopen("block.in","r",stdin);
freopen("block.out","w",stdout);
} int main()
{
memset(h,-1,sizeof h);
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
F(i,1,k)
{
scanf("%d%d%d",&x[i],&y[i],&w[i]);
if (isred(x[i],y[i])) add(S,i,w[i]);
else if (isblue(x[i],y[i])) add(i,T,w[i]);
Link[mp(x[i],y[i])]=i;
}
F(i,1,k)
{
if (isblue(x[i],y[i]))
{
F(k,0,3)
{
int tx=x[i]+mov[k][0],tmp,ty=y[i]+mov[k][1];
if (tx>=1&&tx<=n&&ty>=1&&ty<=m&&isgreen(tx,ty)&&(tmp=Link[mp(tx,ty)]))
add(tmp,i,inf);
}
}
else if (isred(x[i],y[i]))
{
F(k,0,3)
{
int tx=x[i]+mov[k][0],tmp,ty=y[i]+mov[k][1];
if (tx>=1&&tx<=n&&ty>=1&&ty<=m&&isgreen(tx,ty)&&(tmp=Link[mp(tx,ty)]))
add(i,tmp,inf);
}
}
else if (leftgreen(x[i],y[i]))
{
int tmp;
if ((tmp=Link[mp(x[i]+1,y[i])]))
add(i,Link[mp(x[i]+1,y[i])],min(w[i],w[tmp]));
}
else if (rightgreen(x[i],y[i]))
{
int tmp;
if ((tmp=Link[mp(x[i]-1,y[i])]))
add(i,Link[mp(x[i]-1,y[i])],min(w[i],w[tmp]));
}
}
printf("%d\n",dinic());
}
BZOJ 4823 [Cqoi2017]老C的方块 ——网络流的更多相关文章
- bzoj 4823 [Cqoi2017]老C的方块——网络流
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4823 一个不合法方案其实就是蓝线的两边格子一定选.剩下两部分四相邻格子里各选一个. 所以这个 ...
- bzoj 4823: [Cqoi2017]老C的方块 [最小割]
4823: [Cqoi2017]老C的方块 题意: 鬼畜方块游戏不解释... 有些特殊边,有些四个方块组成的图形,方块有代价,删掉一些方块使得没有图形,最小化代价. 比较明显的最小割,一个图形中必须删 ...
- BZOJ 4823: [Cqoi2017]老C的方块
分析: 我觉得我的网络流白学了...QAQ... 其实数据范围本是无法用网络流跑过去的,然而出题者想让他跑过去,也就跑过去了... 看到题目其实感觉很麻烦,不知道从哪里入手,那么仔细观察所给出的有用信 ...
- bzoj 4823: [Cqoi2017]老C的方块【最大权闭合子图】
参考:https://www.cnblogs.com/neighthorn/p/6705785.html 并不是黑白染色而是三色染色(还有四色的,不过是一个意思 仔细观察一下不合法情况,可以发现都是特 ...
- BZOJ 4823 Luogu P3756 [CQOI2017]老C的方块 (网络流、最小割)
题目链接 (Luogu) https://www.luogu.org/problem/P3756 (BZOJ) http://lydsy.com/JudgeOnline/problem.php?id= ...
- [CQOI2017]老C的方块 网络流
---题面--- 题解: 做这题做了好久,,,换了4种建图QAQ 首先我们观察弃疗的形状,可以发现有一个特点,那就是都以一个固定不变的特殊边为中心的,如果我们将特殊边两边的方块分别称为s块和t块, 那 ...
- 洛谷$P3756\ [CQOI2017]$老$C$的方块 网络流
正解:网络流 解题报告: 传送门$QwQ$ 看到不能出现给定的讨厌的图形,简单来说就,特殊边两侧的方格不能同时再连方格. 所以如果出现,就相当于是四种方案?就分别炸四个格子. 然后冷静分析一波之后发现 ...
- bzoj4823: [Cqoi2017]老C的方块(最小割)
4823: [Cqoi2017]老C的方块 题目:传送门 题解: 毒瘤题ORZ.... 太菜了看出来是最小割啥边都不会建...狂%大佬强强强 黑白染色?不!是四个色一起染,四层图跑最小割... 很 ...
- 【BZOJ4823】[CQOI2017]老C的方块(网络流)
[BZOJ4823][CQOI2017]老C的方块(网络流) 题面 BZOJ 题解 首先还是给棋盘进行黑白染色,然后对于特殊边左右两侧的格子单独拎出来考虑. 为了和其他格子区分,我们把两侧的这两个格子 ...
随机推荐
- ef导航属性
https://msdn.microsoft.com/en-us/data/jj574232.aspx 场景是 A表中有B,B表中又C.都是一堆多的关系.怎样Mapping是个问题啊. var ...
- hdu 3555 Bomb 炸弹(数位DP,入门)
题意: 给一个数字n,求从1~n中有多少个数是含有49的,比如49,149,1490等都是含49的. 思路: 2^64也顶多是十进制的20多位,那么按十进制位来分析更简单.如果能计算k位十进制数中分别 ...
- codevs 1683 车厢重组(水题日常)
时间限制: 1 s 空间限制: 1000 KB 题目等级 : 白银 Silver 题目描述 Description 在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转.一个车站的职工 ...
- halcon相机标定及图像矫正
https://blog.csdn.net/humanking7/article/details/44756073 相机标定内容详解:转载自 祥的博客 预备知识 标定中的四个坐标系 1.1.平面旋转 ...
- iOS perform action after period of inactivity (no user interaction)
代码看完后感觉非常优秀 http://stackoverflow.com/questions/8085188/ios-perform-action-after-period-of-inactivity ...
- WPF知识点全攻略09- 附加属性
附加属性也是一种特殊的依赖属性. Canvas中的Canvas.Left,Canvas.Top ,DockPanel中DockPanel.Dock等就是附加属性. 更加.NET类属性的写法经验.这个中 ...
- 常用的 Excel 函数
概述 Excel 学的好,函数不可少.接下来就了解常用的函数. 首先作下简要说明: 本文的内容大多从网上搜集并加以个人理解整理而来,由于初学,可能会出现错误,如有欢迎指出: 所用演示软件为免费丑陋的 ...
- iOS开发各种证书问题
引言 写在前面 一.App ID(bundle identifier) 二.设备(Device) 三.开发证书(Certificates) 四.供应配置文件(Provisioning ...
- thinkphp 结合phpexcel实现excel导入
控制器文件: class ExcelAction extends Action { public function __construct() { import('ORG.Util.ExcelToAr ...
- [CODEVS] 3955 最长严格上升子序列(加强版)
题目描述 Description 给一个数组a1, a2 ... an,找到最长的上升降子序列ab1<ab2< .. <abk,其中b1<b2<..bk. 输出长度即可. ...