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

题解:对于每个$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. Percona-Tookit工具包之pt-stalk

      Preface       We have a lot of methods to diagnose problems in our system such as strace,pstack,gs ...

  2. openldap完整版本搭建记录

    文档信息 目        的:搭建一套完整的OpenLDAP系统,实现账号的统一管理.                     1:OpenLDAP服务端的搭建                   ...

  3. 【c学习-3】

    ---恢复内容开始--- #include<stdio.h> int main(){ ]={,,,,}; ; ;i<=;i++){ printf("%d\n",a ...

  4. 基本数据类型补充,set集合,深浅拷贝等

    1.join:将字符串,列表,用指定的字符连接,也可以用空去连接,这样就可以把列表变成str ll = ["wang","jian","wei&quo ...

  5. Redis ---------- key的操作

    key命名规则 除空格和\n,其他都可以 select   db -index选择数据库 例1  select   5 例2 type 查看数据key类型 type name 例3  keys pat ...

  6. JavaScript高级程序设计第三版.CHM【带实例】

    从驱动全球商业.贸易及管理领域不计其数的复杂应用程序的角度来看,说 JavaScript 已经成为当今世界上最流行的编程语言一点儿都不为过. JavaScript 是一种非常松散的面向对象语言,也是 ...

  7. 493. Reverse Pairs

    // see more at https://www.youtube.com/watch?v=j68OXAMlTM4 // https://leetcode.com/problems/reverse- ...

  8. linux通用GPIO驱动,写GPIO文件不立即生效问题解决

    Linux开发平台实现了通用GPIO的驱动,用户通过,SHell或者系统调用能控制GPIO的输出和读取其输入值.其属性文件均在/sys/class/gpio/目录下,该目录下有export和unexp ...

  9. C# 在窗口绘制图形(打点、画圆、画线)

    需要包含命名空间 using System.Drawing; 画图前需要先创建画板 void Display() { Graphics g = this.CreateGraphics(); //创建画 ...

  10. 笔记-mysql-管理及基础操作

    笔记-mysql使用-管理及基础操作 1.      简介 mysql是一个免费的关系型数据库,不过好像被oracle收购了.... 希望它继续免费. 1.1.    相关术语 数据库,表,列,行,冗 ...