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 题解 首先还是给棋盘进行黑白染色,然后对于特殊边左右两侧的格子单独拎出来考虑. 为了和其他格子区分,我们把两侧的这两个格子 ...
随机推荐
- Objective-C Protocols
Objective-C allows you to define protocols, which declare the methods expected to be used for a part ...
- Azure powershell 获取 vmSize 可用列表的命令
1.使用 Add-AzureAccount -Environment azurechinacloud 登录到订阅 2.选择默认的订阅 Select-AzureSubscription -Subscri ...
- Volley源码解析(三) 有缓存机制的情况走缓存请求的源码分析
Volley源码解析(三) 有缓存机制的情况走缓存请求的源码分析 Volley之所以高效好用,一个在于请求重试策略,一个就在于请求结果缓存. 通过上一篇文章http://www.cnblogs.com ...
- jmeter分布式测试配置
jmeter分布式测试 说明:1台8核16G的windows2008的机器,只能器6000个线程,否则效果不是很好:并且负载机器需要做如下设置: 1.打开注册表:regedit 2.HKEY_LOCA ...
- MySQL存储过程简介和引擎说明
- 解决Starting to watch source with Jekyll and Compass. Starting Rack on port 4000
问题 Starting to watch source with Jekyll and Compass. Starting Rack on port 4000 rake aborted! Errno: ...
- UVA - 658 It's not a Bug, it's a Feature! (隐式图的最短路,位运算)
隐式的图搜索,存不下边,所以只有枚举转移就行了,因为bug的存在状态可以用二进制表示,转移的时候判断合法可以用位运算优化, 二进制pre[i][0]表示可以出现的bug,那么u&pre[i][ ...
- Educational Codeforces Round 11 _D
http://codeforces.com/contest/660/problem/D 这个题据说是很老的题了 然而我现在才知道做法 用map跑了1953ms: 题目大意 给你n个点的坐标 求这些点能 ...
- 模拟水题之unique两行AC
https://icpc.njust.edu.cn/Contest/749/A/ Description 小鱼喜欢吃糖果.他有两盒糖果,两盒糖果分别仅由小写字母组成的字符串s和字符串t构成.其中'a' ...
- “流”的思维—Workflowy
3.“流”的思维—Workflowy是我最喜欢的”流“的工具(WorkFlowy - Organize your brain.)我觉得,让发散性的思维更具实施性,必须分步操作,必须有先后,必须单线程. ...