题目大意:太暴力了,就不写了,看这儿

题解:对于每个$byx$的人,从源点向人连边,容量为此人的寿命。

对于每个手气君的人,从人向汇点连边,容量为此人的寿命。

对于每个$byx$的人与手气君的人,如果$byx$能够用此人赢手气君,从$byx$的这个人向手气君的这个人连一条边,容量为$1$。

对于长者,他的生命要加上本方膜法师的人数,代表续命。

卡点:1.忘记开反向弧(这样也有$10$分,果然暴力)

  ​ 2.数组开小

C++ Code:

#include <cstdio>
#include <cstring>
#define maxn 111 << 1
#define maxm 111 * 111
const int inf = 0x3f3f3f3f;
int S[5][5] = {
{0, 1, 1, 0, 0},
{0, 0, 1, 1, 0},
{0, 0, 0, 1, 1},
{1, 0, 0, 0, 1},
{1, 1, 0, 0, 0}
};
int st, ed;
inline int min(int a, int b) {return a < b ? a : b;}
namespace Dinic {
int st, ed, sz;
int head[maxn], cnt = 2;
struct Edge {
int to, nxt, w;
} e[maxm << 1];
inline void add(int a, int b, int c) {
e[cnt] = (Edge) {b, head[a], c}; head[a] = cnt;
e[cnt ^ 1] = (Edge) {a, head[b], 0}; head[b] = cnt ^ 1;
cnt += 2;
}
int d[maxn], q[maxn], h, t;
inline bool bfs() {
memset(d, 0, sz);
d[q[h = t = 0] = st] = 1;
while (h <= t) {
int u = q[h++];
// printf("u:%d\n", u);
if (u == ed) return true;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (!d[v] && e[i].w) {
d[v] = d[u] + 1;
// printf("v: %d %d\n", v, d[v]);
q[++t] = v;
}
}
}
// printf("d[ed]:%d\n", d[ed]);
return d[ed];
}
int dfs(int x, int low) {
if (!low || x == ed) return low;
int res = 0, w;
for (int i = head[x]; i; i = e[i].nxt) {
int v = e[i].to;
if (d[v] == d[x] + 1 && e[i].w) {
w = dfs(v, min(e[i].w, low - res));
res += w;
e[i].w -= w;
e[i ^ 1].w += w;
if (res == low) return low;
}
}
if (!res) d[x] = -1;
return res;
}
inline int dinic(int ST, int ED) {
st = ST, ed = ED, sz = sizeof d;
int ans = 0;
while (bfs()) ans += dfs(st, inf); //, printf("%d\n", ans);
return ans;
}
}
int n, m, A, B;
inline int get(char *s) {
if (*s == 'J') return 0;
if (*s == 'H') return 1;
if (*s == 'W') return 2;
if (*s == 'E') return 3;
if (*s == 'Y') return 4;
return 20040826;
}
char a[maxn][10], b[maxn][10];
int main() {
scanf("%d%d", &n, &m);
st = 0, ed = n << 1 | 1;
for (int i = 1; i <= n; i++) scanf("%s", a[i]), A += *a[i] == 'Y';
for (int i = 1; i <= n; i++) scanf("%s", b[i]), B += *b[i] == 'Y';
for (int i = 1, x; i <= n; i++) {
scanf("%d", &x);
Dinic::add(st, i, x + (*a[i] == 'J' ? A : 0));
}
for (int i = 1, x; i <= n; i++) {
scanf("%d", &x);
Dinic::add(i + n, ed, x + (*b[i] == 'J' ? B : 0));
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (S[get(a[i])][get(b[j])]) Dinic::add(i, j + n, 1); //, printf("%d %d :%c %c\n", i, j, *a[i], *b[j]);
}
}
printf("%d\n", min(Dinic::dinic(st, ed), m));
return 0;
}

  

[洛谷P3701]「伪模板」主席树的更多相关文章

  1. P3701 「伪模板」主席树

    题目背景 byx和手气君都非常都非常喜欢种树.有一天,他们得到了两颗奇怪的树种,于是各自取了一颗回家种树,并约定几年后比一比谁种出来的树更加牛x. 题目描述 很快,这棵树就开花结果了.byx和手气君惊 ...

  2. [Luogu] P3701 「伪模板」主席树

    题目背景 byx和手气君都非常都非常喜欢种树.有一天,他们得到了两颗奇怪的树种,于是各自取了一颗回家种树,并约定几年后比一比谁种出来的树更加牛x. 题目描述 很快,这棵树就开花结果了.byx和手气君惊 ...

  3. [Luogu 3701] 「伪模板」主席树

    [Luogu 3701] 「伪模板」主席树 这是一道网络流,不是主席树,不是什么数据结构,而是网络流. 题目背景及描述都非常的暴力,以至于 Capella 在做此题的过程中不禁感到生命流逝. S 向 ...

  4. 【luoguP3701】「伪模板」主席树

    description byx和诗乃酱都非常都非常喜欢种树.有一天,他们得到了两颗奇怪的树种,于是各自取了一颗回家种树,并约定几年后比一比谁种出来的树更加牛x. 很快,这棵树就开花结果了.byx和诗乃 ...

  5. LuoguP3701 「伪模板」主席树

    题面 这个题很有意思啊... 其实是道最大流板子题,只连byx会赢的边,S向byx连,另一个连T... 注意有长者时连的边加上同方mogician的个数... 还要注意mogician可以无限续命,也 ...

  6. 洛谷P2633 Count on a tree(主席树上树)

    题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个 ...

  7. 洛谷P4587 [FJOI2016]神秘数(主席树)

    题面 洛谷 题解 考虑暴力,对于询问中的一段区间\([l,r]\),我们先将其中的数升序排序,假设当前可以表示出\([1,k]\)目前处理\(a_i\),假如\(a_i>k+1\),则答案就是\ ...

  8. 【洛谷2839/BZOJ2653】middle(主席树)

    题目: 洛谷2839 分析: 记\(s_i\)表示原序列中第\(i\)大的数. 考虑对于任意一个区间\([a,b]\),设它的中位数为\(s_m\),那么这个区间内大于等于\(s_m\)的数和小于\( ...

  9. LOJ 2555 & 洛谷 P4602 [CTSC2018]混合果汁(二分+主席树)

    LOJ 题目链接 & 洛谷题目链接 题意:商店里有 \(n\) 杯果汁,第 \(i\) 杯果汁有美味度 \(d_i\),单价为 \(p_i\) 元/升.最多可以添加 \(l_i\) 升.有 \ ...

随机推荐

  1. Unicode编码字符 转换成汉字

    转载:http://www.chengxuyuans.com/iPhone_IOS/48128.html - (NSString *)replaceUnicode:(NSString *)unicod ...

  2. avalon.js的循环操作在表格中的应用

    avalon.js的循环操作在表格中的应用 一个JAVA开发,因为做的门户系统中,数据的展示加载的速度很影响使用效果,想到的是尽量少的请求后台,然后接触到了avalon,看介绍这是一个很轻很轻的MVV ...

  3. 牛客小白月赛2 G 文 【模拟】

    链接:https://www.nowcoder.com/acm/contest/86/G来源:牛客网 题目描述 Sεlιнα(Selina) 开始了新一轮的男友海选.她要求她的男友要德智体美劳样样都全 ...

  4. JS - 给String.prototype添加replaceAll方法

    String.prototype.replaceAll = function (targetStr, newStr) {  var sourceStr = this.valueOf();  while ...

  5. Linux下常用压缩 解压命令与压缩比率对比

    常用的格式有:tar, tar.gz(tgz), tar.bz2, 不同方式,压缩和解压方式所耗CPU时间和压缩比率也差异也比较大. 1. tar只是打包动作,相当于归档处理,不做压缩:解压也一样,只 ...

  6. give me something new 无用但有趣

    屏保系列 http://www.asty.org/cmatrix/dist/cmatrix-1.2a.tar.gz  //数码雨 libaa-bin //燃烧 海洋馆 http://search.cp ...

  7. 解决win10子系统Ubuntu新装的mysql 不能root登陆方法

    步骤一:打开终端 $sudo /etc/init.d/mysql stop $sudo mkdir -p /var/run/mysqld $sudo chown mysql:mysql /var/ru ...

  8. POJ 2891 中国剩余定理(不互素)

    Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 17877 ...

  9. 004---Django简单示例

    一.MVC与MTV模型  在web开发领域里著名的MVC模式,所谓MVC就是把web应用分为模型(M).控制器(C).视图(V)三层,达到了解耦的效果. 一次完整的请求如图: 但是django用的是M ...

  10. Partitioning by Palindromes UVA - 11584 简单dp

    题目:题目链接 思路:预处理出l到r为回文串的子串,然后如果j到i为回文串,dp[i] = min(dp[i], dp[j] + 1) AC代码: #include <iostream> ...