link。

good题,考虑像 国家集训队 - happiness 一样在棋盘上搞染色,我毛张 @shadowice1987 的图给你看啊

你像这样奇数层以 red -> blue -> green -> yellow 为一个周期,偶数层 yellow -> green -> blue -> red,就会发现给出的形状都包括恰好四种颜色和一条黑线。那现在就好搞了,就是要在每个连通块里面删除至少一种颜色的全部方块(包括黑线),有这样几种选择:全绿 / 全黄 / 全黑线(即破环红或蓝中的一个),像图右侧一样建图就好了。

#include<bits/stdc++.h>
using namespace std;
enum Color { red=1,blue,yellow,green };
const long long INF=0x3f3f3f3f;
template<class Kap> struct Net {
const long long n;
struct Arc {
long long to, rev; Kap cap;
};
vector<long long> lev,iter;
vector<vector<Arc>> e;
std::queue<long long> q;
Net(long long n):n(n),e(n),lev(n),iter(n) {}
void add(long long one,long long ano,Kap cap) {
// printf(" %lld %lld %lld\n",one,ano,cap);
e[one-1].push_back((Arc){ano-1,(long long)(e[ano-1].size())+(one==ano),cap});
e[ano-1].push_back((Arc){one-1,(long long)(e[one-1].size())-1,0});
}
Kap solve(long long s,long long t) { return solve(s-1,t-1,std::numeric_limits<Kap>::max()); }
bool Getlayer(long long s,long long t) {
lev.assign(n,0);
while(q.size()) q.pop();
lev[s]=1;
q.emplace(s);
while(q.size()) {
long long now=q.front();
q.pop();
if(now==t) break;
for(long long i=0; i<(long long)(e[now].size()); ++i) {
long long y=e[now][i].to; Kap cap=e[now][i].cap;
if(!lev[y] && cap) lev[y]=lev[now]+1,q.emplace(y);
}
}
return lev[t];
};
Kap Augment(long long now,Kap up,long long t) {
if(now==t) return up;
Kap rlow=0;
for(long long& i=iter[now]; i<(long long)(e[now].size()); ++i) {
if(!up) break;
long long y=e[now][i].to; Kap& cap=e[now][i].cap;
if(lev[y]==lev[now]+1 && cap) {
Kap f=Augment(y,min(up,cap),t);
if(f<=0) continue;
cap-=f; e[y][e[now][i].rev].cap+=f; up-=f; rlow+=f;
}
}
if(!rlow) lev[now]=n+1;
return rlow;
};
Kap solve(long long s,long long t,const Kap inf) {
lev.assign(n,0); iter.assign(n,0); Kap res=0,tmp;
while (Getlayer(s,t)) {
iter.assign(n, 0);
if((tmp=Augment(s,inf,t))) res+=tmp;
else break;
}
return res;
}
};
long long r,c,n,celx[100100],cely[100100],celw[100100],S,T,co[100100];
map<long long,long long> mp;
bool valid(long long x,long long y) { return x>=1 && x<=r && y>=1 && y<=c; }
long long getid(long long x,long long y) { return 1ll*(x-1)*c+y; }
signed main() {
scanf("%lld %lld %lld",&c,&r,&n);
for(long long i=1; i<=n; ++i) scanf("%lld %lld %lld",&cely[i],&celx[i],&celw[i]),mp[getid(celx[i],cely[i])]=i;
// for(long long i=1; i<=n; ++i) printf(" ---- %lld %lld %lld\n",celx[i],cely[i],celw[i]);
for(long long i=1; i<=n; ++i) {
if(cely[i]%4==0) co[i]=(celx[i]&1)?3:1;
else if(cely[i]%4==1) co[i]=(celx[i]&1)?1:3;
else if(cely[i]%4==2) co[i]=(celx[i]&1)?2:4;
else co[i]=(celx[i]&1)?4:2;
}
// char tmp[5][10]={"tmp","red","blue","yellow","green"};
// for(long long i=1; i<=n; ++i) puts(tmp[co[i]]);
// for(long long i=1; i<=n; ++i) printf(" %lld",co[i]);
// puts("");
// 1 for red, 2 for blue, 3 for yellow, 4 for green
Net<long long> G(n+2); S=n+1; T=n+2;
for(long long i=1; i<=n; ++i) {
if(co[i]==yellow /*yellow*/) {
G.add(S,i,celw[i]);
if(valid(celx[i],cely[i]-1)) {
long long j=mp[getid(celx[i],cely[i]-1)];
if(j && co[j]==red) G.add(i,j,INF);
}
if(valid(celx[i],cely[i]+1)) {
long long j=mp[getid(celx[i],cely[i]+1)];
if(j && co[j]==red) G.add(i,j,INF);
}
// printf(" --- %lld %lld\n",celx[i],cely[i]);
if(valid(celx[i]-1,cely[i])) {
long long j=mp[getid(celx[i]-1,cely[i])];
if(j && co[j]==red) G.add(i,j,INF);
}
if(valid(celx[i]+1,cely[i])) {
long long j=mp[getid(celx[i]+1,cely[i])];
if(j && co[j]==red) G.add(i,j,INF);
}
}
else if(co[i]==green /*green*/) {
G.add(i,T,celw[i]);
if(valid(celx[i],cely[i]-1)) {
long long j=mp[getid(celx[i],cely[i]-1)];
if(j && co[j]==blue) G.add(j,i,INF);
}
if(valid(celx[i],cely[i]+1)) {
long long j=mp[getid(celx[i],cely[i]+1)];
if(j && co[j]==blue) G.add(j,i,INF);
}
if(valid(celx[i]+1,cely[i])) {
long long j=mp[getid(celx[i]+1,cely[i])];
if(j && co[j]==blue) G.add(j,i,INF);
}
if(valid(celx[i]-1,cely[i])) {
long long j=mp[getid(celx[i]-1,cely[i])];
if(j && co[j]==blue) G.add(j,i,INF);
}
}
else if(co[i]==red) {
if(valid(celx[i],cely[i]+1)) {
long long j=mp[getid(celx[i],cely[i]+1)];
// if(celx[i]==1 && cely[i]==1 && j) printf(" -- %lld %lld %lld %lld %lld\n",celx[i],cely[i],celw[i],getid(celx[i],cely[i]),mp[getid(celx[i],cely[i])]);
if(j && co[j]==blue) G.add(i,j,min(celw[i],celw[j]));
}
if(valid(celx[i],cely[i]-1)) {
long long j=mp[getid(celx[i],cely[i]-1)];
// if(celx[i]==1 && cely[i]==1 && j) printf(" -- %lld %lld %lld %lld %lld\n",celx[i],cely[i],celw[i],getid(celx[i],cely[i]),mp[getid(celx[i],cely[i])]);
if(j && co[j]==blue) G.add(i,j,min(celw[i],celw[j]));
}
if(valid(celx[i]+1,cely[i])) {
long long j=mp[getid(celx[i]+1,cely[i])];
// if(celx[i]==1 && cely[i]==1 && j) printf(" -- %lld %lld %lld %lld %lld\n",celx[i],cely[i],celw[i],getid(celx[i],cely[i]),mp[getid(celx[i],cely[i])]);
if(j && co[j]==blue) G.add(i,j,min(celw[i],celw[j]));
}
if(valid(celx[i]-1,cely[i])) {
long long j=mp[getid(celx[i]-1,cely[i])];
// if(celx[i]==1 && cely[i]==1 && j) printf(" -- %lld %lld %lld %lld %lld\n",celx[i],cely[i],celw[i],getid(celx[i],cely[i]),mp[getid(celx[i],cely[i])]);
if(j && co[j]==blue) G.add(i,j,min(celw[i],celw[j]));
}
}
}
printf("%lld\n",G.solve(S,T));
return 0;
}

「loj - 3022」「cqoi 2017」老 C 的方块的更多相关文章

  1. [LOJ#3022][网络流]「CQOI2017」老 C 的方块

    题目传送门 定义有特殊边相邻的格子颜色为黑,否则为白 可以看出,题目给出的限制条件的本质是如果两个小方块所在的格子 \(x\) 和 \(y\) 为两个相邻的黑格,那么 \(x\) 和 \(y\) 之间 ...

  2. Loj #2331. 「清华集训 2017」某位歌姬的故事

    Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...

  3. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  4. Loj #2321. 「清华集训 2017」无限之环

    Loj #2321. 「清华集训 2017」无限之环 曾经有一款流行的游戏,叫做 *Infinity Loop***,先来简单的介绍一下这个游戏: 游戏在一个 \(n \times m\) 的网格状棋 ...

  5. Loj 2320.「清华集训 2017」生成树计数

    Loj 2320.「清华集训 2017」生成树计数 题目描述 在一个 \(s\) 个点的图中,存在 \(s-n\) 条边,使图中形成了 \(n\) 个连通块,第 \(i\) 个连通块中有 \(a_i\ ...

  6. 【LOJ#6066】「2017 山东一轮集训 Day3」第二题(哈希,二分)

    [LOJ#6066]「2017 山东一轮集训 Day3」第二题(哈希,二分) 题面 LOJ 题解 要哈希是很显然的,那么就考虑哈希什么... 要找一个东西可以表示一棵树,所以我们找到了括号序列. 那么 ...

  7. [LOJ#2330]「清华集训 2017」榕树之心

    [LOJ#2330]「清华集训 2017」榕树之心 试题描述 深秋.冷风吹散了最后一丝夏日的暑气,也吹落了榕树脚下灌木丛的叶子.相识数年的Evan和Lyra再次回到了小时候见面的茂盛榕树之下.小溪依旧 ...

  8. [LOJ#2329]「清华集训 2017」我的生命已如风中残烛

    [LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...

  9. [LOJ#2328]「清华集训 2017」避难所

    [LOJ#2328]「清华集训 2017」避难所 试题描述 "B君啊,你当年的伙伴都不在北京了,为什么你还在北京呢?" "大概是因为出了一些事故吧,否则这道题就不叫避难所 ...

  10. [LOJ#2327]「清华集训 2017」福若格斯

    [LOJ#2327]「清华集训 2017」福若格斯 试题描述 小d是4xx9小游戏高手. 有一天,小d发现了一个很经典的小游戏:跳青蛙. 游戏在一个 \(5\) 个格子的棋盘上进行.在游戏的一开始,最 ...

随机推荐

  1. Galaxy Project | 生信人最值得学习的开源项目之一

    我与 Galaxy Project 的渊源可以追溯到我刚毕业,还在华大实习的那一段时间,这个项目应该是我职业生涯中最重要的一段经历.虽然这么对年以来一直都关注着这个项目,但大多数都是浅尝辄止,对源码层 ...

  2. 如何获取 C#程序 内核态线程栈

    一:背景 1. 讲故事 在这么多的案例分析中,往往会发现一些案例是卡死在线程的内核态栈上,但拿过来的dump都是用户态模式下,所以无法看到内核态栈,这就比较麻烦,需要让朋友通过其他方式生成一个蓝屏的d ...

  3. Ubuntu 16.04关闭系统自动更新

    # 背景在使用阿里云ECS服务器时,服务器CPU与内存突然增大,经过排查发现是系统自动更新导致,幸运的是不是发生在业务高峰期,为了避免出现类似的情况,决定禁用系统自动更新,可以通过手动或者定时任务的方 ...

  4. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-4-playwright等待浅析

    1.简介 在介绍selenium的时候,宏哥也介绍过等待,是因为在某些元素出现后,才可以进行操作.有时候我们自己忘记添加等待时间后,查了半天代码确定就是没有问题,奇怪的就是获取不到元素.然后搞了好久, ...

  5. Go 语言 context 都能做什么?

    原文链接: Go 语言 context 都能做什么? 很多 Go 项目的源码,在读的过程中会发现一个很常见的参数 ctx,而且基本都是作为函数的第一个参数. 为什么要这么写呢?这个参数到底有什么用呢? ...

  6. 使用Python读取图片

    一.Python学习两大道具 1. dir()工具 作用:支持打开package,看到里面的工具函数 示例: (1) 输出torch库包含的函数 dir(torch) (2) 输出torch.AVG函 ...

  7. JDBC的增删改-结果集的元数据-Class反射-JDBC查询封装

    一.使用JDBC批量添加 ​ 知识点复习: ​1.JDBC的六大步骤 (导入jar包, 加载驱动类,获取连接对象, 获取sql执行器.执行sql与并返回结果, 关闭数据库连接) 2.​封装了一个DBU ...

  8. 用windows脚本命令netsh快速启用、禁用网络

    用windows脚本命令netsh快速启用.禁用网络 不知道你有没有这种需求:公司单位里的网络是内网,有时需要连接手机热点wifi网络,这时就需要先禁用内网网卡,启用无线网卡.连接内网的时候又需要先禁 ...

  9. PWM点灯

    目录 PWM脉冲宽调点灯 前言 1.什么是PWM 2.PWM的实现 3.PWM实现步骤(通用定时器) 3.1 打开定时器的时钟 3.2 配置端口 3.3 设置定时器 3.4 设置PWM 3.5 完整代 ...

  10. mysql的初体验——重装解决99%的问题

    这两天被java_web的作业搞得头皮发麻,主要原因就是因为jdbc连接数据库一直失败,甚至差点把电脑搞崩,删个注册表,结果用户变量也被删了,心态直接炸裂.有以下几个地方,引以为戒: 1.配置环境最好 ...