Codechef July Challenge 2019 Snake and Apple Tree
费用流。
把每个方格拆成 $T$ 个点,$t$ 时刻一个方格向周围四个方格的 $t + 1$ 的点连一条容量为 $1$ 费用为 $0$ 的边,向自身的 $t + 1$ 连一条容量为 $1$ 费用为该方格最大幸福值的边。
源点向方格为 'S' 的0时刻连一条容量为 $1$ 费用为 $0$ 的边。所有点的 $T - 1$ 时刻向汇点连一条容量为 $1$ 费用为该方格最大幸福值的边。
还有每个格子同时刻不能有多条蛇呆在上面,再把每个点每个时刻拆成两个点,容量为 $1$ 费用为 $0$。跑最大费用最大流即可。
#include <bits/stdc++.h>
using namespace std; const int N = ;
const int NN = 1e5 + , M = 5e5 + ;
const int INF = 0x3f3f3f3f; template<class T>
inline void checkmax(T &a, T b) {
if (a < b) a = b;
}
template<class T>
inline void checkmin(T &a, T b) {
if (a > b) a = b;
} struct E {
int v, ne, f, c;
} e[M];
int head[NN], cnt, tol;
int id[N][N][], mp[N][N][];
int dis[NN], path[NN], n, m, z, t;
bool inq[NN];
char str[N][N];
const int dx[] = {, , , -}, dy[] = {-, , , }; inline void add(int u, int v, int f, int c) {
e[cnt].v = v; e[cnt].f = f; e[cnt].c = c; e[cnt].ne = head[u]; head[u] = cnt++;
e[cnt].v = u; e[cnt].f = ; e[cnt].c = -c; e[cnt].ne = head[v]; head[v] = cnt++;
} bool spfa(int s, int t) {
for (int i = ; i <= t; i++)
dis[i] = INF, inq[i] = , path[i] = -;
dis[s] = ;
inq[s] = ;
queue<int> que;
que.push(s);
while (!que.empty()) {
int u = que.front(); que.pop();
inq[u] = ;
for (int i = head[u]; ~i; i = e[i].ne) {
int v = e[i].v, c = e[i].c;
if (e[i].f && dis[v] > dis[u] + c) {
dis[v] = dis[u] + c;
path[v] = i;
if (!inq[v]) {
inq[v] = ;
que.push(v);
}
}
}
}
return dis[t] != INF;
} int mcf(int s, int t) {
int ans = ;
while (spfa(s, t)) {
for (int i = path[t]; ~i; i = path[e[i ^ ].v]) e[i].f--, e[i ^ ].f++;
ans += dis[t];
}
return ans;
} int main() {
//freopen("in.txt", "r", stdin);
memset(head, -, sizeof(head));
scanf("%d%d%d%d", &n, &m, &z, &t);
for (int i = ; i <= n; i++)
scanf("%s", str[i] + );
for (int i = ; i <= z; i++) {
int x, y, p, q, h;
scanf("%d%d%d%d%d", &x, &y, &p, &q, &h);
for (int j = p; j < q; j++)
checkmax(mp[x][y][j], h);
}
tol = ;
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++) if (str[i][j] != '#')
for (int k = ; k < t; k++) {
add(tol, tol + , , );
//cout << tol << ' ' << tol + 1 << endl;
id[i][j][k] = tol;
tol += ;
}
int S = tol + , T = tol + ;
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++) if (id[i][j][]) {
for (int d = ; d < ; d++) if (id[i + dx[d]][j + dy[d]][])
for (int k = ; k < t - ; k++)
add(id[i][j][k] + , id[i + dx[d]][j + dy[d]][k + ], , );
for (int k = ; k < t - ; k++)
add(id[i][j][k] + , id[i][j][k + ], , -mp[i][j][k]);
add(id[i][j][t - ] + , T, , -mp[i][j][t - ]);
if (str[i][j] == 'S') add(S, id[i][j][], , );
}
printf("%d\n", -mcf(S, T));
return ;
}
Codechef July Challenge 2019 Snake and Apple Tree的更多相关文章
- Codechef July Challenge 2019 Division 1题解
题面 \(CIRMERGE\) 破环成链搞个裸的区间\(dp\)就行了 //quming #include<bits/stdc++.h> #define R register #defin ...
- Codechef July Challenge 2019 Hit the Coconuts
假设现在有一堆数,我想要保证能取出一个,至少需要敲 (数的个数)*(这些数里的最小值)那么把这些数从大到小排序,$dp[i][j]$ 表示前 $i$ 个里面保证能取出 $j$ 个需要敲的次数.$dp[ ...
- Codechef April Challenge 2019 游记
Codechef April Challenge 2019 游记 Subtree Removal 题目大意: 一棵\(n(n\le10^5)\)个结点的有根树,每个结点有一个权值\(w_i(|w_i\ ...
- [codechef July Challenge 2017] Pishty and tree
PSHTTR: Pishty 和城堡题目描述Pishty 是生活在胡斯特市的一个小男孩.胡斯特是胡克兰境内的一个古城,以其中世纪风格的古堡和非常聪明的熊闻名全国.胡斯特的镇城之宝是就是这么一座古堡,历 ...
- Codechef December Challenge 2014 Chef and Apple Trees 水题
Chef and Apple Trees Chef loves to prepare delicious dishes. This time, Chef has decided to prepare ...
- CodeChef April Challenge 2019题解
传送门 \(Maximum\ Remaining\) 对于两个数\(a,b\),如果\(a=b\)没贡献,所以不妨假设\(a<b\),有\(a\%b=a\),而\(b\%a<a\).综上, ...
- Codechef April Challenge 2019 Division 2
Maximum Remaining 题意:给n个数,取出两个数$a_{i}$,$a_{j}$,求$a_{i}\% a_{j}$取模的最大值 直接排个序,第二大(严格的第二大)模第一大就是答案了. #i ...
- Codechef November Challenge 2019 Division 1
Preface 这场CC好难的说,后面的都不会做QAQ 还因为不会三进制位运算卷积被曲明姐姐欺负了,我真是太菜了QAQ PS:最后还是狗上了六星的说,期待两(三)场之内可以上七星 Physical E ...
- Codechef October Challenge 2019 Division 1
Preface 这次CC难度较上两场升高了许多,后面两题都只能借着曲明姐姐和jz姐姐的仙气来做 值得一提的是原来的F大概需要大力分类讨论,结果我写了一大半题目就因为原题被ban了233 最后勉强涨了近 ...
随机推荐
- SpringBoot扩展点之三:SpringBootServletInitializer扩展
SpringBootServletInitializer 熟悉了SpringApplication的原理之后,我们再来了解SpringBootServletInitializer的原理就比较容易了. ...
- AGC035
Contest Page A 唯一会做的题/kk 题目相当于要求相邻三个的异或和为\(0\). 当我们放入了三个数\(a,b,c\)时,接下来的放入顺序显然一定是\(a,b,c,a,b,c,...\) ...
- SQL系列(三)—— 注释(comment)
SQL语句是由DBMS处理的指令.如果你希望包括不进行处理和执行的文本,该怎么办呢?为什么你想要这么做呢?原因有以下几 点. 我们这里使用的SQL语句都很短,也很简单.然而,随着你的SQL语句变长,复 ...
- java基础 super和this
/** * super关键字的用法有三种: * 1.在子类的成员方法中,访问父类的成员变量 * 2.在子类的成员方法中,访问父类的成员方法 * 3.在子类的构造方法中,访问父类的构造方法 * * th ...
- C#读写调整修改设置UVC摄像头画面-逆光对比
有时,我们需要在C#代码中对摄像头的逆光对比进行读和写,并立即生效.如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的 ...
- HTML转换特效相关插件
Arctext.js Arctext.js 是基于 Lettering.js 的文字旋转插件,根据设置的旋转半径准确计算每个字母的旋转弧度并均匀分布. 虽然 CSS3 也能够实现字符旋转效果,但是要让 ...
- 英语orientaljasper鸡血石orientaljasper单词
鸡血石(orientaljasper),是辰砂条带的地开石,因鲜红色似鸡血的辰砂(朱砂)而得名.鸡血石含有辰砂(朱砂).石英.玉髓35%-45%.磁铁矿.赤铁矿6%-12%.辰砂约5%-8%. 鸡血石 ...
- orcale的to_number方法
转自:https://blog.csdn.net/tiantangdizhibuxiang/article/details/81034893 TO_NUMBER函数()是Oracle中常用的类型转换函 ...
- 一次 Young GC 的优化实践(FinalReference 相关)
本文转载自公众号:涤生的博客,阅读时间大约需要11分钟.涤生的文章看起来跟破案一样,很精彩,很有启发. 前言 博客已经好久没有更新了,主要原因是 18 年下半年工作比较忙,另外也没有比较有意思的题材, ...
- FastJson--阿里开源的速度最快的Json和对象转换工具 https://www.cnblogs.com/kaituorensheng/p/8082631.html
import java.util.ArrayList;import java.util.List;import java.util.HashMap;import java.util.Map; impo ...