Description

老 C 是个程序员。
作为一个懒惰的程序员,老 C 经常在电脑上玩方块游戏消磨时间。游戏被限定在一个由小方格排成的R行C列网格上
,如果两个小方格有公共的边,就称它们是相邻的,而且有些相邻的小方格之间的公共边比较特殊。特殊的公共边排
列得有很强的规律。首先规定,第1行的前两个小方格之间的边是特殊边。然后,特殊边在水平方向上每4个小方格为
一个周期,在竖直方向上每2个小方格为一个周期。所有的奇数列与下一列之间都有特殊边,且所在行的编号从左到
右奇偶交替。下图所示是一个R = C = 8的网格,蓝色标注的边是特殊边。首先,在第1行,第1列和第2列之间有一条
特殊边。因为竖直方向周期为2,所以所有的奇数行,第1列和第2列之间都有特殊边。因为水平方向周期为4,所以所
有奇数行的第5列和第6列之间也有特殊边,如果网格足够大,所有奇数行的第9列和第10列、第13列和第14列之间都
有特殊边。因为所有的奇数列和下一列之间都有特殊边,所以第3列和第4列、第7列和第8列之间也有特殊边,而所在
行的编号从左到右奇偶交替,所以它们的特殊边在偶数行。如果网格的规模更大,我们可以用同样的方法找出所有的
特殊边。

网格的每个小方格刚好可以放入一个小方块,在游戏的一开始,有些小方格已经放上了小方块,另外的小方格没有放
。老 C 很讨厌下图所示的图形,如果他发现有一些小方块排列成了它讨厌的形状(特殊边的位置也要如图中所示),
就很容易弃疗,即使是经过任意次旋转、翻转后排列成讨厌的形状,老 C 也同样容易弃疗。

为了防止弃疗,老 C 决定趁自己还没有弃疗,赶紧移除一些格子里小方块,使得剩下的小方块不能构成它讨厌的形状
。但是游戏里每移除一个方块都是要花费一些金币的,每个方块需要花费的金币有多有少参差不齐。老 C 当然希望
尽可能少的使用游戏里的金币,但是最少要花费多少金币呢?老 C 懒得思考,就把这个问题交给你了

Input

第一行有3个正整数C, R, n,表示C列R行的网格中,有n个小方格放了小方块。
接下来n行,每行3个正整数x, y, w,表示在第x列第y行的小方格里放了小方块,移除它需要花费w个金币。保证不会
重复,且都在网格范围内。
1 ≤ C, R, n ≤ 10^5 , 1 ≤ w ≤ 10^4

Output

输出一行,包含一个整数,表示最少花费的金币数量。

Sample Input

2 2 4

1 1 5

1 2 6

2 1 7

2 2 8

Sample Output

5


简要题解

染色分层+最小割


想法

观察使老C弃疗的图形

发现它们都由特殊边两边的紫色格子,及一个蓝格子、一个绿格子组成。

由此我们可以给整张图染色

(为了方便我把两个紫格子分别染成紫与深蓝)

我们需要移除一些格子使图中不存在连续的 蓝-紫-深蓝-绿 或 绿-紫-深蓝-蓝
由此可以想到用最小割(有一句话说得好:灵感源于性质的相似性)
最小割即把对点的限制转换到对边的限制上。

开始建图。
S向每个绿格子连边,容量为绿格子的w
每个绿格子向相邻的紫格子与深蓝格子连边,容量为INF
紫格子与相邻深蓝格子互相连边,容量为两个格子w的min (其实这两个相邻的点是一体的,就相当于是一个大点。这两个点中间连边相当于拆大点。)
紫格子与深蓝格子向相邻的蓝格子连边,容量为INF
蓝格子向T连边,容量为蓝格子的w


代码

这道题A的真是不容易……
一开始懒得写hash表光写个hash,结果那么不幸就被卡上了……
(哎,这是第二次了……之前有一次cf没写hash表被hack了…)
调了好久好久,不开森。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>#define INF 2000000007
#define P 100999using namespace std;typedef long long ll;
const int N = 100007;struct node{int v,f;node *next,*rev;
}pool[N*10],*h[N];
int cnt;void addedge(int u,int v,int f){node *p=&pool[++cnt],*q=&pool[++cnt];p->v=v;p->next=h[u];h[u]=p; p->f=f;p->rev=q;q->v=u;q->next=h[v];h[v]=q; q->f=0;q->rev=p;
}int S,T;
int que[N],level[N];
bool bfs(){int head=0,tail=0,u,v;for(int i=S;i<=T;i++) level[i]=-1;level[S]=1; que[tail++]=S;while(head<tail){u=que[head++];for(node *p=h[u];p;p=p->next)if(p->f && level[v=p->v]==-1){level[v]=level[u]+1;que[tail++]=v;   }if(level[T]!=-1) return true;} return false;
}
int find(int u,int f){int v,s=0,t;if(u==T) return f;for(node *p=h[u];p;p=p->next)if(p->f && s<f && level[v=p->v]==level[u]+1){t=find(v,min(p->f,f-s));if(t){s+=t;p->f-=t;p->rev->f+=t;}}if(!s) level[u]=-1;return s;
}
int dinic(){int flow=0;while(bfs()) flow+=find(S,INF);return flow;
}int C,R,n;struct data{int x,y,w,id;
}d[N];int hash(int x,int y) { if(x<=0 || y<=0 || x>R || y>C) return P;return ((ll)x*N+y)%P;
}
vector<data> hh[P+1];int check(int c,int x,int y){if(c==P) return 0;for(int i=0;i<hh[c].size();i++)if(hh[c][i].x==x && hh[c][i].y==y) return hh[c][i].id;return 0;
}int main()
{scanf("%d%d%d",&C,&R,&n);for(int i=1;i<=n;i++){scanf("%d%d%d",&d[i].y,&d[i].x,&d[i].w);d[i].id=i;hh[hash(d[i].x,d[i].y)].push_back(d[i]);}//addedgeint t,xx,yy;S=0; T=n+1;for(int i=1;i<=n;i++){xx=d[i].x%2; yy=d[i].y%4;if((xx==1 && yy==1) || (xx==0 && yy==3)){ //purplet=check(hash(d[i].x,d[i].y+1),d[i].x,d[i].y+1);if(t) addedge(i,t,min(d[i].w,d[t].w));}else if((xx==1 && yy==2) || (xx==0 && yy==0)){ //dark bluet=check(hash(d[i].x,d[i].y-1),d[i].x,d[i].y-1);if(t) addedge(i,t,min(d[i].w,d[t].w)); }else if((xx==1 && yy==3) || (xx==0 && yy==2)){ //greenaddedge(S,i,d[i].w);t=check(hash(d[i].x+1,d[i].y),d[i].x+1,d[i].y);if(t) addedge(i,t,INF);t=check(hash(d[i].x-1,d[i].y),d[i].x-1,d[i].y);if(t) addedge(i,t,INF);if(yy==3) t=check(hash(d[i].x,d[i].y-1),d[i].x,d[i].y-1);else t=check(hash(d[i].x,d[i].y+1),d[i].x,d[i].y+1);if(t) addedge(i,t,INF); }else{ //blueaddedge(i,T,d[i].w);t=check(hash(d[i].x+1,d[i].y),d[i].x+1,d[i].y);if(t) addedge(t,i,INF);t=check(hash(d[i].x-1,d[i].y),d[i].x-1,d[i].y);if(t) addedge(t,i,INF);if(yy==1) t=check(hash(d[i].x,d[i].y-1),d[i].x,d[i].y-1);else t=check(hash(d[i].x,d[i].y+1),d[i].x,d[i].y+1);if(t) addedge(t,i,INF); }}printf("%d\n",dinic());return 0;
}

转载于:https://www.cnblogs.com/lindalee/p/8447250.html

[bzoj4823][洛谷P3756][Cqoi2017]老C的方块相关推荐

  1. 洛谷P3755 [CQOI2017]老C的任务 题解

    题目传送门 题目描述 老C是个程序员. 最近老C从老板那里接到了一个任务--给城市中的手机基站写个管理系统.作为经验丰富的程序员,老C轻松地完成了系统的大部分功能,并把其中一个功能交给你来实现. 由于 ...

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

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

  3. 题解 [CQOI2017] 老 C 的方块

    这题我们教练出的. Sto nodgd Orz 一般来说,看到网格题,想到网络流.看到要炸点,考虑染色,这道题的四个形状都是四个格子,考虑染成四色(图片来自 shadowice1984 的题解): 那 ...

  4. 洛谷P1816 忠诚 题解

    洛谷P1816 忠诚 题解 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人 ...

  5. 并查集——村村通(洛谷 P1536)

    题目选自洛谷P1536 并查集的变相考察类型的题目 先处理每一条存在的边,即把每条存在的边所连接的两个结点用并查集合并起来. 然后通过记录不同的代表元个数,就可以知道有多少个集合,即有多少个连通块了. ...

  6. 二分答案——烦恼的高考志愿(洛谷 P1678)

    题目选自洛谷P1678 如果仅仅是套循环的话显然在数据比较大的情况下是不够优化 的,所以我们可以先把得到的分数线排序再二分操作. 这道题二分的原理很简单,因为我们求的是某一个学生和某一个分数线最小的差 ...

  7. 深度优先搜索——选数(洛谷 P1036)

    今天的题是一道深度优先搜索的题 题目链接 选自洛谷(P1036) 是一道很经典的DFS问题 首先我们先看一下题目是怎么描述的,读完题目我会在后面给出详细的思路! 题目描述 已知 nn 个整数 x_1, ...

  8. 洛谷 P2186 小Z的栈函数

    洛谷 P2186 小Z的栈函数 题目 题目描述 小Z最近发现了一个神奇的机器,这个机器的所有操作都是通过维护一个栈来完成的,它支持如下11个操作: NUM X:栈顶放入X. POP:抛弃栈顶元素. I ...

  9. 对于洛谷提高试炼场-动态规划篇的爆破

    题外话 由于本蒟蒻的动态规划实在是太弱啦,所以有必要爆破一下洛谷提高试炼场.里面有很多非常好,难度也合适的动态规划题--(然而你还是抄了不少题解) niconiconi~让我们一起开始爆破吧. lv- ...

最新文章

  1. DDoS deflate的安装使用
  2. php使用swoole的应用场景
  3. 【例题5-7 UVA - 136】Ugly Numbers
  4. [Java网络编程基础]网络编程概述,三要素,IP地址
  5. Linux vsftpd(ftp)安装包安装方法
  6. append从一个添加到另一_小米的另一妙用,制作小米锅巴,吃着嘎嘣脆,一口一个香得很...
  7. eltable表头高度无法设置_厨房吊顶高度一般多少?厨房吊顶安装需要注意什?...
  8. 如何看注解的源码_我们为什么要看源码、应该如何看源码?
  9. 51单片机:定时器/计数器TMOD设定
  10. java中使用libreoffice将word转换成pdf格式
  11. 证券交易2-券商柜台系统
  12. java正态分布的运用
  13. vue文件上传(单文件以及多文件)
  14. 计算机智能科学与技术高校排名,2021年全国智能科学与技术专业大学排名(原创)...
  15. 夜深人静写算法(九)- Dancing Links X(跳舞链)
  16. Python编程语言好学吗? 零基础转行能学Python吗?
  17. 记录一下,为什么QQ复制整个文件夹后,仍然没有聊天记录
  18. 记一次IOS打包报错
  19. CString字符串操作
  20. iOS图像处理(4)坐标变化

热门文章

  1. 13.小结Action
  2. OneAlert 入门(一)——事件流
  3. Android onTouchEvent, onClick及onLongClick的调用机制
  4. emacs org-mode文件转html文件
  5. 每个程序员都必须遵守的编程原则
  6. order one question for the 4e4 exploitation
  7. DML、DDL、DCL的分别是什么
  8. Flutter入坑分享
  9. javaWeb中的Model1和Model2
  10. TP5安装失败怎么办?