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

题解:对于每个$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. 【ODT】cf896C - Willem, Chtholly and Seniorious

    仿佛没用过std::set Seniorious has n pieces of talisman. Willem puts them in a line, the i-th of which is ...

  2. zeppelin ERROR总结

    ERROR [2017-03-23 20:01:50,799] ({qtp331657670-221} NotebookServer.java[onMessage]:221) - Can't hand ...

  3. A Country on Wheels【车轮上的国家】

    A Country on Wheels As cultural symbols go, the American  car is quite young. 作为文化象征的美国汽车还相当年轻. The ...

  4. 裸机——LCD

    1.先了解显示器们 CRT显示器 原理,使用电子轰击荧光粉实现显示. 特点,主动发光,颜色绚丽,但是大. 等离子显示器(PDP) 原理,在显示屏上排列上千个密封的小低压气体室,通过电流激发使其发出肉眼 ...

  5. Android 第三方库RxLifecycle使用

    1.简单介绍RxLifecycle 1.1.使用原因. 在使用rxjava的时候,如果没有及时解除订阅,在退出activity的时候,异步线程还在执行. 对activity还存在引用,此时就会产生内存 ...

  6. 16,docker入门

      在学一门新知识的时候,超哥喜欢提问,why?what?how? wiki资料 什么是docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一 ...

  7. SQL语句知识点

    PERSON表 NUMBER NAME SEX AGE 1 THERON male 19 2 JACK male 20 3 LUCY female 20 1.SELECT选择     SELECT 列 ...

  8. 《Cracking the Coding Interview》——第16章:线程与锁——题目2

    2014-04-27 19:14 题目:如何测量上下文切换的时间? 解法:首先,上下文切换是什么,一搜就知道.对于这么一个极短的时间,要测量的话,可以通过放大N倍的方法.比如:有A和B两件事,并且经常 ...

  9. LCS+LIS

    #include<iostream> #include<string> using namespace std; string a,b; ][]; int main() { w ...

  10. Jmeter 场景设计

    今天的业务场景是: 1.管理员登录后台---登录成功后添加一个某类型的产品---产品添加成功后,再为该产品添加10个排期. 2.管理员登录后台--登录成功后添加多个不同类型产品---产品全部添加完成后 ...