分析:

我觉得我的网络流白学了...QAQ...

其实数据范围本是无法用网络流跑过去的,然而出题者想让他跑过去,也就跑过去了...

看到题目其实感觉很麻烦,不知道从哪里入手,那么仔细观察所给出的有用信息...

我们考虑网格图是一个含有挡板的图,这个挡板的分布很有规律,大概是每一行的相邻两个挡板都隔了四个格子,并且奇数行的排列相同,偶数行的排列相同...

然后考虑不合法的方块形状有什么共同点:仔细观察就会发现,所有的不合法图形中,挡板的左边至少有一个格子,右边至少有一个格子,并且左边的格子连着一个格子,右边的的格子连着一个格子...也就是说,其实我们如果要使得整张图的所有方块构成的图形全部合法就要满足下图中如果挡板两边的紫色格子都有方块存放的话,那么,和这两个紫色格子相邻的色格子和黑色格子不能同时存在...

我们发现刚好相邻隔板之间的四个格子就是为不合法图案而设计的...

于是就变成了经典的限制问题...经典的最小割...

如果不考虑紫色的格子,那么这整张网格图就是一个二分图...我们给这张图染色...

那么对于所有的白点,我们连$<S,x,w[x]>$的边,对于所有的黑点我们连$<x,T,w[x]>$的边,然后因为要保证紫色格子周围黑白点不能同时存在,所以,对于所有的黑点,我们从紫色格子像黑点连$inf$的边,从白点像紫色格子连$inf$的边,然后因为我们两个紫色格子不同时存在的时候黑白点是可以同时存在的,所以两个紫色格子之间连上$min(w[x],w[y])$的边...然后求最小割就好了...

给出了不合法的图形,一定要找到不合法的方案的相同点,然后转换成一些基础的模型来解决...

对于网格图的问题,二分图应该是最常见的应用...

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<map>
//by NeighThorn
#define inf 0x3f3f3f3f
using namespace std; const int maxn=100000+5,maxm=1000000+5; int n,m,S,T,no,cnt;
int hd[maxn],fl[maxm],to[maxm],nxt[maxm],pos[maxn];
int mv[2][3][2]={-1,0,1,0,0,1,-1,0,1,0,0,-1}; vector<int> v[maxn]; map< pair<int,int>,pair<int,int> > mp; inline void add(int x,int y,int s){
fl[cnt]=s;to[cnt]=y;nxt[cnt]=hd[x];hd[x]=cnt++;
fl[cnt]=0;to[cnt]=x;nxt[cnt]=hd[y];hd[y]=cnt++;
} inline bool bfs(void){
memset(pos,-1,sizeof(pos));
int head=0,tail=0,q[maxn];
q[0]=S;pos[S]=0;
while(head<=tail){
int top=q[head++];
for(int i=hd[top];i!=-1;i=nxt[i])
if(fl[i]&&pos[to[i]]==-1)
pos[to[i]]=pos[top]+1,q[++tail]=to[i];
}
return pos[T]!=-1;
} inline int find(int v,int f){
if(v==T) return f;
int res=0,t;
for(int i=hd[v];i!=-1&&f>res;i=nxt[i])
if(pos[to[i]]==pos[v]+1&&fl[i])
t=find(to[i],min(f-res,fl[i])),res+=t,fl[i]-=t,fl[i^1]+=t;
if(!res) pos[v]=-1;
return res;
} inline int dinic(void){
int res=0,t;
while(bfs())
while(t=find(S,inf))
res+=t;
return res;
} signed main(void){
#ifndef ONLINE_JUDGE
freopen("block1.in","r",stdin);
#endif
memset(hd,-1,sizeof(hd));
scanf("%d%d%d",&m,&n,&no);S=0,T=no+1;
for(int i=1,x,y,w;i<=no;i++)
scanf("%d%d%d",&y,&x,&w),mp[make_pair(x,y)]=make_pair(i,w),v[x].push_back(y);
for(int i=1;i<=n;i++)
sort(v[i].begin(),v[i].end());
for(int i=1,x,y,xw,yw,be,lx,ly,rx,ry;i<=n;i++)
for(int j=0;j<v[i].size();j++){
x=i,y=v[i][j];
if((x&1)&&y%4==1){
if(j<v[i].size()-1&&v[i][j+1]==y+1)
add(mp[make_pair(x,y)].first,mp[make_pair(x,y+1)].first,min(mp[make_pair(x,y)].second,mp[make_pair(x,y+1)].second));
}
else if((x&1)&&y%4==2){
for(int k=0;k<3;k++)
if(mp.find(make_pair(x+mv[0][k][0],y+mv[0][k][1]))!=mp.end())
add(mp[make_pair(x,y)].first,mp[make_pair(x+mv[0][k][0],y+mv[0][k][1])].first,inf);
}
else if((x&1)==0&&y%4==0){
if(j>0&&v[i][j-1]==y-1)
add(mp[make_pair(x,y)].first,mp[make_pair(x,y-1)].first,min(mp[make_pair(x,y)].second,mp[make_pair(x,y-1)].second));
}
else if((x&1)==0&&y%4==3){
for(int k=0;k<3;k++)
if(mp.find(make_pair(x+mv[1][k][0],y+mv[1][k][1]))!=mp.end())
add(mp[make_pair(x,y)].first,mp[make_pair(x+mv[1][k][0],y+mv[1][k][1])].first,inf);
}
else if(((x+y)&1)&&(x&1)){
for(int k=0;k<3;k++)
if(mp.find(make_pair(x+mv[0][k][0],y+mv[0][k][1]))!=mp.end())
add(mp[make_pair(x,y)].first,mp[make_pair(x+mv[0][k][0],y+mv[0][k][1])].first,inf);
add(S,mp[make_pair(x,y)].first,mp[make_pair(x,y)].second);
}
else if((x&1)&&((x+y)&1)==0){
for(int k=0;k<3;k++)
if(mp.find(make_pair(x+mv[1][k][0],y+mv[1][k][1]))!=mp.end())
add(mp[make_pair(x+mv[1][k][0],y+mv[1][k][1])].first,mp[make_pair(x,y)].first,inf);
add(mp[make_pair(x,y)].first,T,mp[make_pair(x,y)].second);
}
else if(((x+y)&1)&&(x&1)==0){
for(int k=0;k<3;k++)
if(mp.find(make_pair(x+mv[1][k][0],y+mv[1][k][1]))!=mp.end())
add(mp[make_pair(x,y)].first,mp[make_pair(x+mv[1][k][0],y+mv[1][k][1])].first,inf);
add(S,mp[make_pair(x,y)].first,mp[make_pair(x,y)].second);
}
else{
for(int k=0;k<3;k++)
if(mp.find(make_pair(x+mv[0][k][0],y+mv[0][k][1]))!=mp.end())
add(mp[make_pair(x+mv[0][k][0],y+mv[0][k][1])].first,mp[make_pair(x,y)].first,inf);
add(mp[make_pair(x,y)].first,T,mp[make_pair(x,y)].second);
}
}
printf("%d\n",dinic());
return 0;
}

  


By NeighThorn

BZOJ 4823: [Cqoi2017]老C的方块的更多相关文章

  1. bzoj 4823: [Cqoi2017]老C的方块 [最小割]

    4823: [Cqoi2017]老C的方块 题意: 鬼畜方块游戏不解释... 有些特殊边,有些四个方块组成的图形,方块有代价,删掉一些方块使得没有图形,最小化代价. 比较明显的最小割,一个图形中必须删 ...

  2. bzoj 4823 [Cqoi2017]老C的方块——网络流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4823 一个不合法方案其实就是蓝线的两边格子一定选.剩下两部分四相邻格子里各选一个. 所以这个 ...

  3. BZOJ 4823 [Cqoi2017]老C的方块 ——网络流

    lrd的题解:http://www.cnblogs.com/liu-runda/p/6695139.html 我还是太菜了.以后遇到这种题目应该分析分析性质的. 网络流复杂度真是$O(玄学)$ #in ...

  4. bzoj 4823: [Cqoi2017]老C的方块【最大权闭合子图】

    参考:https://www.cnblogs.com/neighthorn/p/6705785.html 并不是黑白染色而是三色染色(还有四色的,不过是一个意思 仔细观察一下不合法情况,可以发现都是特 ...

  5. bzoj4823: [Cqoi2017]老C的方块(最小割)

    4823: [Cqoi2017]老C的方块 题目:传送门 题解: 毒瘤题ORZ.... 太菜了看出来是最小割啥边都不会建...狂%大佬强强强   黑白染色?不!是四个色一起染,四层图跑最小割... 很 ...

  6. 【BZOJ4823】[CQOI2017]老C的方块(网络流)

    [BZOJ4823][CQOI2017]老C的方块(网络流) 题面 BZOJ 题解 首先还是给棋盘进行黑白染色,然后对于特殊边左右两侧的格子单独拎出来考虑. 为了和其他格子区分,我们把两侧的这两个格子 ...

  7. bzoj 4822: [Cqoi2017]老C的任务

    4822: [Cqoi2017]老C的任务 练手速... #include <iostream> #include <cstdio> #include <cstring& ...

  8. BZOJ 4823 Luogu P3756 [CQOI2017]老C的方块 (网络流、最小割)

    题目链接 (Luogu) https://www.luogu.org/problem/P3756 (BZOJ) http://lydsy.com/JudgeOnline/problem.php?id= ...

  9. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

随机推荐

  1. leetcode笔记--2 reverse string

    my answer: 出错点:new_list[s] = list_s[u-1-s] 这样会出错, 重点:(1) map(str, s) 函数的使用,例:ls = [1,2,3]rs = map(st ...

  2. Django笔记 —— 模板高级进阶

    最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...

  3. 商业地产 招商 招租 CRM 意向 洽谈 合同 复用商铺商户管理系统

    适用场合 本软件适合商业地产的对招商的全流程管理,包括商铺信息,商户信息,洽谈信息,意向签订,合同管理等. 软件有试用版可供下载试用. 联系方式 QQ:2417158658 Tel:130251102 ...

  4. Qt irrlicht(鬼火)3D引擎 摄像机旋转问题

    点击打开链接Irrlicht中的摄像有一个函数 setUpVector() if (m_device != 0 ) { core::vector3df rotation(y,x,0.f); m_cam ...

  5. centos7使用Gogs搭建Git服务器

    一.初次接触Gogs,记录一下搭建过程 二.平台环境 Linux: CentOS7.5.1804 MySQL: 5.6.35 安装步骤: linux服务器新建git用户: 下载.解压gogs安装包: ...

  6. 命令行编译 WPF

    在开发调试代码 WPF 时,经常需要在修改完成代码后,点击 Rebuild,然后到指定文件夹下点击打开对应的 .exe 验证程序是否正确, 可以通过以下命名实现修改程序后,点击一个 .bat 文件,直 ...

  7. Jquery append()总结(一) 转载

    转载自:http://dushanggaolou.iteye.com/blog/1173457 append(content)  /** * 向每个匹配的元素内部追加内容. * 这个操作与对指定的元素 ...

  8. c++调用Python基础功能

    c++调用Python首先安装Python,以win7为例,Python路径为:c:\Python35\,通过mingw编译c++代码.编写makefile文件,首先要添加包含路径:inc_path ...

  9. JSONP跨域jQuery处理整理(附天气数据实例)

    写在前面 跨域的解决方案有多种,其中最常见的是使用同一服务器下的代理来获取远端数据,再通过ajax进行读取,而在这期间经过了两次请求过程,使得获取数据的效率大大降低,这篇文章蓝飞就为大家介绍一下解决跨 ...

  10. 多线程&&I/O

    不是操作系统的,是UNIX环境高级编程的!