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

题解:对于每个$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. java斗地主扑克 扑克牌 洗牌 发牌 Collection 集合练习

    package com.swift.poker; import java.util.ArrayList; import java.util.Collections; /*训练考核知识点:Collect ...

  2. leetcode笔记(二)94. Binary Tree Inorder Traversal

    题目描述 (原题目链接) Given a binary tree, return the inorder traversal of its nodes' values. For example:Giv ...

  3. Centos7 使用LVM进行新加磁盘管理

    centos7使用LVM管理一块新的磁盘   注意!文中凡是带#的都是命令标志.   一些重要概念: LV(Logical Volume)- 逻辑卷, VG(Volumne Group)- 卷组, P ...

  4. Windows Server 2012 搭建DHCP及远程路由访问

    1.1    基础环境信息 1.2    DHCP与远程访问服务器角色安装 1.服务器管理器—>仪表板—>添加角色和功能,出现添加角色和功能向导,点击下一步 2.选择安装类型为基于角色或基 ...

  5. java 动态生成SQL

    代码如下: /** * 动态生成SQ及SQL参数L * @param ve 接收到的消息的CHGLIST * @param paramList MQ消息中的SQL参数 * @param t 泛型对象 ...

  6. FreeBSD--常用命令

    FreeBSD常用命令   查看网络流量 a.systat -if 1 (1表示1s刷新屏幕一次) b.netstat 1 # Traffic 流量 peak 峰值 average 平均值 查看进程p ...

  7. C# 控件置于最顶层、最底层、隐藏、显示

    控件置于最顶层.最底层 pictureBox1.BringToFront();//将控件放置所有控件最前端 pictureBox1.SendToBack();//将控件放置所有控件最底端 控件隐藏.显 ...

  8. POJ:2367-Cleaning Shifts

    传送门:http://poj.org/problem?id=2376 Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Sub ...

  9. poj 1759 二分搜索

    题意:N个等差数列,初项X_i,末项Y_i,公差Z_i,求出现奇数次的数? 思路: 因为只有一个数出现的次数为奇数个 假设 第二个数字的个数为 奇数个,其余全部都是偶数个 ,累计出现的次数 a1偶数 ...

  10. Oozie 实战之 shell

    说明:使用 shell action 执行 shell 脚本 hive-select-test.sh 来通过已经配置好的 Hive -f 来执行 HQL 查询脚本文件 select.sql 1.创建脚 ...