[洛谷P3701]「伪模板」主席树
题目大意:太暴力了,就不写了,看这儿
题解:对于每个$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]「伪模板」主席树的更多相关文章
- P3701 「伪模板」主席树
题目背景 byx和手气君都非常都非常喜欢种树.有一天,他们得到了两颗奇怪的树种,于是各自取了一颗回家种树,并约定几年后比一比谁种出来的树更加牛x. 题目描述 很快,这棵树就开花结果了.byx和手气君惊 ...
- [Luogu] P3701 「伪模板」主席树
题目背景 byx和手气君都非常都非常喜欢种树.有一天,他们得到了两颗奇怪的树种,于是各自取了一颗回家种树,并约定几年后比一比谁种出来的树更加牛x. 题目描述 很快,这棵树就开花结果了.byx和手气君惊 ...
- [Luogu 3701] 「伪模板」主席树
[Luogu 3701] 「伪模板」主席树 这是一道网络流,不是主席树,不是什么数据结构,而是网络流. 题目背景及描述都非常的暴力,以至于 Capella 在做此题的过程中不禁感到生命流逝. S 向 ...
- 【luoguP3701】「伪模板」主席树
description byx和诗乃酱都非常都非常喜欢种树.有一天,他们得到了两颗奇怪的树种,于是各自取了一颗回家种树,并约定几年后比一比谁种出来的树更加牛x. 很快,这棵树就开花结果了.byx和诗乃 ...
- LuoguP3701 「伪模板」主席树
题面 这个题很有意思啊... 其实是道最大流板子题,只连byx会赢的边,S向byx连,另一个连T... 注意有长者时连的边加上同方mogician的个数... 还要注意mogician可以无限续命,也 ...
- 洛谷P2633 Count on a tree(主席树上树)
题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个 ...
- 洛谷P4587 [FJOI2016]神秘数(主席树)
题面 洛谷 题解 考虑暴力,对于询问中的一段区间\([l,r]\),我们先将其中的数升序排序,假设当前可以表示出\([1,k]\)目前处理\(a_i\),假如\(a_i>k+1\),则答案就是\ ...
- 【洛谷2839/BZOJ2653】middle(主席树)
题目: 洛谷2839 分析: 记\(s_i\)表示原序列中第\(i\)大的数. 考虑对于任意一个区间\([a,b]\),设它的中位数为\(s_m\),那么这个区间内大于等于\(s_m\)的数和小于\( ...
- LOJ 2555 & 洛谷 P4602 [CTSC2018]混合果汁(二分+主席树)
LOJ 题目链接 & 洛谷题目链接 题意:商店里有 \(n\) 杯果汁,第 \(i\) 杯果汁有美味度 \(d_i\),单价为 \(p_i\) 元/升.最多可以添加 \(l_i\) 升.有 \ ...
随机推荐
- SQL递归查询实现组织机构树
系统用到的组织机构树,要实现对当前节点以及其子节点的查询,数据库SQL要用到递归查询,这也是我第一次接触SQL的递归查询. 先说一下什么是递归查询,简单说来是将一个树状结构存储在一张表里,比如一个表中 ...
- Linux - 用户环境变量的查看与设置
1. 查看当前有哪些环境变量 直接输入命令:env 2. 设置用户环境变量 输入命令:vim ~/.bash_profile,打开文件,输入如下内容: 范例(设置maven环境变量): export ...
- Java OOP——JAVA关键字与保留字说明及使用
1.abstract abstract 关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. - ...
- 【linux】【指令】systemctl 指令部分解读
systemctl [OPTIONS...] {COMMAND} ... Query or send control commands to the systemd manager. -h --hel ...
- list函数及list对象的reverse方法
list的reverse方法,是就地reverse,不返回值 如a是一个list,a.reverse()直接将a这个list给reverse了,所以如果print(a.reverse())就是None ...
- stdio中牛逼的写法
用空间换时间的典型 /* * NOTE! This ctype does not handle EOF like the standard C * library is required to. */ ...
- 树上dfs+思维
#include<cstdio> ; int cnt,head[N],n; int size[N],num[N]; void init() { cnt = ; ;i<N;i++) h ...
- Android面试收集录12 View测量、布局及绘制原理
一.View绘制的流程框架 View的绘制是从上往下一层层迭代下来的.DecorView-->ViewGroup(--->ViewGroup)-->View ,按照这个流程从上往下, ...
- PowerDesigner如何将一个包里的表拷贝到另一个表以后在视图中也可以显示?
第一步:选中PhysicalDiagram_1 第二步:点击:“ Symbol”按钮, 第三步:点击“Show Symbols”,出现如下界面 第四步:选中State.
- 这个写法会出什么问题: @property (copy) NSMutableArray *array;
因为copy策略拷贝出来的是一个不可变对象,然而却把它当成可变对象使用,很容易造成程序奔溃 //如:-[__NSArrayI removeObjectAtIndex:]: unrecognized s ...