题目背景

byx和手气君都非常都非常喜欢种树。有一天,他们得到了两颗奇怪的树种,于是各自取了一颗回家种树,并约定几年后比一比谁种出来的树更加牛x。

题目描述

很快,这棵树就开花结果了。byx和手气君惊讶的发现,这是一棵主席树,树上长满了主席和主席的朋友们。这棵树上一共有五种人,主席(J),记者(HK),高人(W),女王(E)和膜法师(YYY)。他们发现,他们的主席树上的人数相同,都为N。

研究发现,这五种人的输赢如上图所示(一样的人不能PK),箭头指向输的人。至于为什么,留给同学们自己思考。

比赛如期进行。

byx和手气君要进行M场比赛,每一场比赛他们会选出树上的两个人来比较看谁更牛x。

第i个人寿命为Lifei秒,每次比完赛他们就会-1s。当他们生命为0s时他们就不能再比赛了。

同时,当J的寿命为0时,同一棵树上的YYY可以为他+1s。每个YYY只能给.每个J续一次。

那么问题来了

现在给定N,M(1≤N≤100,1≤M≤1000),A和B每一个人所属种类(J,HK,W,YYY或E)以及每一个人的生命,生命不超过50.请你算算A最多能够赢得多少场比赛呢。

数据保证每一场一定都有人用。两个人之间只能比一场。

输入输出格式

输入格式:

第一行包含两个数N,M,含义看上面。

第二行N个字串(J,HK,W,YYY或E),表示byx的人所属种类,用空格隔开。

第三行N个字串(J,HK,W,YYY或E),表示手气君的人所属种类,用空格隔开。

第四行N个数,表示byx的人的生命。

第五行N个数,表示手气君的人的生命。

输出格式:

一个数,byx能赢的场次

输入输出样例

输入样例#1:

3 3
J W YYY
J HK E
2 2 2
2 2 2
输出样例#1:

3

说明

第一场主席赢记者,第二场高人赢女王,第三场膜法师赢记者。

Solution:

  本题最大流。

  读完题后,不难发现是一张二分图的模型,而且角色克制关系也给定了,那么就是个傻逼建图了。

  我们由源点向byx的每个人连边流量为生命值,由手气君的每个人向汇点连边流量为生命值,对于byx的每个节点按照击败关系向手气君的节点连边流量为$1$,由于$YYY$可以为每个$J$加血,所以统计下byx和手气君各自的$YYY$个数,再对于各自的$J$都补建$YYY$个数为流量的边就好了。(开始WA的原因:注意不能直接统计角色总血量然后对每种角色建图,因为两个角色之间只能比一次,而且每个$YYY$可以为每个$J$加一次血,都有流量限制,所以只能$n^2$建图)

代码:

/*Code by 520 -- 9.25*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=,inf=;
int n,m,s,t,dis[],a[],b[];
int to[N],net[N],w[N],cnt=,h[N];
map<string,int>mp; il void add(int u,int v,int c){
to[++cnt]=v,net[cnt]=h[u],h[u]=cnt,w[cnt]=c;
to[++cnt]=u,net[cnt]=h[v],h[v]=cnt,w[cnt]=;
} queue<int>q;
bool bfs(){
memset(dis,-,sizeof(dis));
dis[s]=,q.push(s);
while(!q.empty()){
RE int u=q.front();q.pop();
for(RE int i=h[u];i;i=net[i])
if(w[i]&&dis[to[i]]==-) dis[to[i]]=dis[u]+,q.push(to[i]);
}
return dis[t]!=-;
} int dfs(int u,int op){
if(u==t) return op;
int flow=,used=;
for(RE int i=h[u];i;i=net[i]){
int v=to[i];
if(w[i]&&dis[to[i]]==dis[u]+){
used=dfs(to[i],min(w[i],op));
if(!used) continue;
flow+=used,op-=used;
w[i]-=used,w[i^]+=used;
if(!op) break;
}
}
if(!flow) dis[u]=-;
return flow;
} int main(){
scanf("%d%d",&n,&m),t=;
mp["J"]=,mp["HK"]=,mp["W"]=,mp["YYY"]=,mp["E"]=;
string ca[],cb[];int na[],nb[];
int ta=,tb=;
For(i,,n) cin>>ca[i];
For(i,,n) cin>>cb[i];
For(i,,n) {
cin>>na[i],add(s,i,na[i]);
if(mp[ca[i]]==) ta++;
}
For(i,,n) {
cin>>nb[i],add(i+,t,nb[i]);
if(mp[cb[i]]==) tb++;
}
For(i,,n) {
if(mp[ca[i]]==) add(s,i,ta);
if(mp[cb[i]]==) add(i+,t,tb);
}
For(i,,n) For(j,,n){
int p=mp[ca[i]],q=mp[cb[j]];
if(p==&&(q==||q==)) add(i,j+,);
if(p==&&(q==||q==)) add(i,j+,);
if(p==&&(q==||q==)) add(i,j+,);
if(p==&&(q==||q==)) add(i,j+,);
if(p==&&(q==||q==)) add(i,j+,);
}
int ans=;
while(bfs()) ans+=dfs(s,inf);
cout<<min(ans,m);
return ;
}

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

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

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

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

    题目大意:太暴力了,就不写了,看这儿 题解:对于每个$byx$的人,从源点向人连边,容量为此人的寿命. 对于每个手气君的人,从人向汇点连边,容量为此人的寿命. 对于每个$byx$的人与手气君的人,如果 ...

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

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

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

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

  5. LuoguP3701 「伪模板」主席树

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

  6. 「模板」 线段树——区间乘 && 区间加 && 区间求和

    「模板」 线段树--区间乘 && 区间加 && 区间求和 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long l ...

  7. 「WC 2019」数树

    「WC 2019」数树 一道涨姿势的EGF好题,官方题解我并没有完全看懂,尝试用指数型生成函数和组合意义的角度推了一波.考场上只得了 44 分也暴露了我在数数的一些基本套路上的不足,后面的 \(\ex ...

  8. 【题解】#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT)

    [题解]#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT) 之前做这道题不理解,有一点走火入魔了,甚至想要一本近世代数来看,然后通过人类智慧思考后发现, ...

  9. 【Luogu】P3384主席树模板(主席树查询K小数)

    YEAH!我也是一个AC主席树模板的人了! 其实是个半吊子 我将尽量详细的讲出我的想法. 主席树太难,我们先搞普通线段树好了 普通线段树怎么做?我的想法是查询K次最小值,每次查完把查的数改成INF,查 ...

随机推荐

  1. 微信小程序—day01

    前言 听说谷歌准备回中国了,玩了一下谷歌刚入驻微信的小程序:“猜画小歌”,又一次见识到了ai的强大魅力.看来python之路,前途还是一片光明的. 因为18年初时的“跳一跳”,带火了微信小程序,一直想 ...

  2. ASN.1编码方式详解

    ASN ASN.1 – Abstract Syntax Notation dot one,抽象记法1.数字1被ISO加在ASN的后边,是为了保持ASN的开放性,可以让以后功能更加强大的ASN被命名为A ...

  3. 【CentOS 7】nginx配置web服务器

    1,安装过程 [root@VM_1_14_centos ~]# cd /data/ [root@VM_1_14_centos data]# wget http://nginx.org/download ...

  4. PCL 库存在vtk的问题导致libproj.so链接错误

    常变现为** No rule to make target '/usr/lib/x86_64-linux-gnu/libproj.so', needed by ××× vtk库的bug导致,目前尚未修 ...

  5. 笨办法学Python - 习题3: Numbers and Math

    目录 习题 3: 数字和数学计算 算术运算符 加分习题: 我的答案: 总结: 扩展: Python比较运算符 Python赋值运算符 Python位运算符 Python逻辑运算符 Python成员运算 ...

  6. 7.openldap使用ssl加密认证

    作者:yaoyao 1.服务器端部署 1.自建CA中心 1.CA中心生成自身私钥 #cd /etc/pki/CA #(umask 077; openssl genrsa -out private/ca ...

  7. Tomcat之初识初体验

    1.what's this? Stable performance, free Java web application server! 相关: Java,Javac,JVM,JRE,JDK,Java ...

  8. git push remote: User permission denied

    这种错误因为本地保存了一个错误的账号密码,只需要重新编辑成正确的账号密码 直接上方法

  9. 多种方法实现左右固定,中间自适应的CSS布局

    布局是面试中常问的问题,尤其是这类的题目,怎么答才好呢? 大多数人的第一个方法是浮动,没错,浮动.第二个方法呢?你回答定位,没错.第三个方法呢?.... 第四个方法呢?第五个方法呢?.... 其实能想 ...

  10. 第十章I/O

    系统级i/o 开始进程时的三个标准: 标准输入(描述符0):STDIN_FILENO 标准输出(描述符1):STDOUT_FILENO 标准错误(描述符2):STDERR_FILENO 文件位置: 从 ...