题目大意:

题目链接:https://www.luogu.org/problemnew/show/P3701

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

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

研究发现,这五种人的输赢如上图所示(一样的人不能PK),箭头指向输的人。

比赛如期进行。

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

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

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

那么问题来了

现在给定 N , M N,M N,M,byx和手气君每一个人所属种类 ( J , H K , W , Y Y Y , E ) (J,HK,W,YYY,E) (J,HK,W,YYY,E)以及每一个人的生命,生命不超过 50 50 50。请你算算byx最多能够赢得多少场比赛呢。

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


思路:

AC的第一道黑题!!!

这道题跟主席树有神马关系啊(有个人物叫主席就是主席树???)
正解是网络流。
对于每个byx的数上的人物,将它连向 s s s,流量为生命。对于每个手气君树上的人物,将它连向 t t t,流量为生命。特别的,对于主席,容量要加上该树的膜法师的个数(每个膜法师可以给它加上一条命)
然后,枚举两棵树上的人物,以胜负关系连边(胜连负),容量为 1 1 1。
然后跑一边 D i n i c Dinic Dinic即可。记住最终答案要和 m m m取最小值(总场数不能超过 m m m场)


代码:

#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
#define N 510
#define M 10010
#define Inf 1e9
using namespace std;int n,m,head[N],dep[N],x,s,t,tot=1,ya,yb,sum,ans;
char a[N][10],b[N][10];struct edge
{int next,to,c;
}e[M];void add(int from,int to,int c)
{tot++;e[tot].to=to;e[tot].c=c;e[tot].next=head[from];head[from]=tot;
}bool bfs()  //分层
{memset(dep,0x3f,sizeof(dep));dep[s]=0;queue<int> q;q.push(s);while (q.size()){int u=q.front();q.pop();for (int i=head[u];i;i=e[i].next){int v=e[i].to;if (dep[v]>dep[u]+1&&e[i].c)  {dep[v]=dep[u]+1;  //更新q.push(v);}}}return (dep[t]<0x3f3f3f3f);
}int dfs(int u,int low)
{int lows=0;if (u==t) return low;for (int i=head[u];i;i=e[i].next){int v=e[i].to;if (dep[v]==dep[u]+1&&e[i].c){lows=dfs(v,min(low,e[i].c));if (!lows) continue;e[i].c-=lows;e[i^1].c+=lows;return lows;}}return 0;
}int dinic()
{while (bfs()&&ans<m)while (sum=dfs(s,Inf)&&ans<m)  //当ans>=m时就可以不用跑了ans+=sum;return min(ans,m);  //其实可以直接写成return ans,因为上面保证了m>ans
}int main()
{memset(head,-1,sizeof(head));scanf("%d%d",&n,&m);s=n*2+1;t=n*2+2;for (int i=1;i<=n;i++){cin>>a[i];if (a[i][0]=='Y') ya++;  //byx的膜法师个数} for (int i=1;i<=n;i++){cin>>b[i];if (b[i][0]=='Y') yb++;  //手气君的膜法师个数} for (int i=1;i<=n;i++){scanf("%d",&x);if (a[i][0]=='J') add(s,i,x+ya);else add(s,i,x);add(i,s,0);}for (int i=1;i<=n;i++){scanf("%d",&x);if (b[i][0]=='J') add(i+n,t,x+yb);else add(i+n,t,x);add(t,i+n,0);}for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)  //枚举人物if (a[i][0]!=b[j][0]){if (a[i][0]=='W'&&b[j][0]=='Y'){add(i,j+n,1);add(j+n,i,0);}if (a[i][0]=='W'&&b[j][0]=='E'){add(i,j+n,1);add(j+n,i,0);}if (a[i][0]=='J'&&b[j][0]=='W'){add(i,j+n,1);add(j+n,i,0);}if (a[i][0]=='J'&&b[j][0]=='H'){add(i,j+n,1);add(j+n,i,0);}if (a[i][0]=='E'&&b[j][0]=='Y'){add(i,j+n,1);add(j+n,i,0);}if (a[i][0]=='E'&&b[j][0]=='J'){add(i,j+n,1);add(j+n,i,0);}if (a[i][0]=='Y'&&b[j][0]=='J'){add(i,j+n,1);add(j+n,i,0);}if (a[i][0]=='Y'&&b[j][0]=='H'){add(i,j+n,1);add(j+n,i,0);}if (a[i][0]=='H'&&b[j][0]=='E'){add(i,j+n,1);add(j+n,i,0);}if (a[i][0]=='H'&&b[j][0]=='W'){add(i,j+n,1);add(j+n,i,0);}}printf("%d\n",dinic());return 0;
}

【洛谷P3701】 「伪模板」主席树【网络流】相关推荐

  1. P3701 -「伪模板」主席树【网络流,最大流】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P3701 题目大意 给出若干个人的克制关系 给出两边每个人的种类和血量 ...

  2. P3701 「伪模板」主席树-(网络流最大流)

    题目链接:点击进入 思路 对于每个byx的人,从源点向人连边,容量为此人的寿命. 对于每个诗乃酱的人,从人向汇点连边,容量为此人的寿命. 注:对于主席,他的寿命要多加上sum,sum为本方膜法师的人数 ...

  3. 【JZOJ3794】【洛谷P1383】高级打字机【主席树】

    题目大意: 题目链接: 洛谷:https://www.luogu.org/problemnew/show/P1383 JZOJ:https://jzoj.net/senior/#main/show/3 ...

  4. YBTOJ洛谷P2839:最大中位数(主席树、二分答案)

    遇事不决,二分试试 解析 很好的一道题 真是把主席树玩明白了 一个关于中位数的常用trick: 二分答案mid,把>=mid的看成1,<mid的看成-1,然后看最大子段和是否>=0 ...

  5. 洛谷P2839 [国家集训队]middle(主席树)

    P2839 [国家集训队]middle 我们可以考虑二分中位数 checkcheckcheck 答案,那么我们对于某个值 midmidmid ,把 [l,r][l,r][l,r] 内的所有小于 mid ...

  6. 如何告别「伪勤奋」?高冷冷

    转载:如何告别「伪勤奋」?高冷冷_许可 我来教你如何做到真正的勤奋吧,学会这4点,告别伪勤奋. 你有很多目标,有关于上进的决心和焦虑,也或多或少做了一些努力.每天把自己搞得很累,回头却发现自己什么都没 ...

  7. 【洛谷】P3919 【模板】可持久化线段树(主席树)

    题目 传送门:QWQ 分析 主席树的模板,囤着 代码 #include <bits/stdc++.h> using namespace std; const int N=1000010; ...

  8. LOJ6435 洛谷5465 「PKUSC2018」星际穿越 倍增

    题目链接: loj6435 洛谷5465 蒟蒻zyd:这不是大水题吗?看我写个O(nlog2n)O(nlog^2n)O(nlog2n)的诡异ST表卡卡常数跑过去 题目:输出区间距离和 蒟蒻zyd:(笑 ...

  9. LOJ 3049: 洛谷 P5284: 「十二省联考 2019」字符串问题

    题目传送门:LOJ #3049. 题意简述: 给定一个长度为 \(n\) 的母串 \(S\). 有 \(n_a\) 个 A 类串,都是 \(S\) 的子串,以区间的形式给出. 有 \(n_b\) 个 ...

最新文章

  1. 【Live555】live555源码详解系列笔记
  2. oracle 隐藏视图定义,Oracle中视图(views)的含义
  3. 高效使用PC需要记住的快捷键
  4. python递归汉诺塔详解_汉诺塔在python中递归,理解磁盘目的地的变化
  5. json转modbus协议模块_华杰智控Profinet 分布式IO系列模块-华杰智控-新闻中心
  6. C++编程基础二 03-const形参与实参
  7. 龙武2服务器在维护,龙武5.25更新维护时间_龙武5.5更新维护详情_牛游戏网
  8. 深度学习——CNN的学习笔记
  9. 我所期待的易语言2007
  10. Avalon二数据填充
  11. rgb图像转换为二进制bin文件格式(matlab)
  12. 【2019-2020春学期】数据库作业16:第七章: 数据库设计
  13. 英格索兰扳手网口通信协议EOR原理
  14. 巨佬Jake Wharton曾说过:一个App只需要一个Activity
  15. 2022虎符线上团队赛 有关web的部分题解(持续更新)
  16. 海尔简爱s11怎么进入bios_海尔简爱s11系统应用商店没有登录界面怎么办?
  17. linux 使用设备树点亮LED 实战
  18. U盘装系统启动时按F12没有反应的原因之一
  19. linux vim粘贴快捷键设置,vim粘贴模式快捷方式
  20. 【总结】初创公司用AWS搭建高扩展性架构

热门文章

  1. 计算机各部件的作用是什么,计算机由哪些基本部件组成?各部件的作用是什么...
  2. Windows 10 Build 15019,“蓝光”功能更名为“夜光”
  3. 个人简历中英双语词汇对照资料[推荐收藏]
  4. (八)可视化KITTI标注的TrackID
  5. layoutParams的用法
  6. 递归巧解汉诺塔问题(hanoi)
  7. 7个步骤轻松创建你的专属社交媒体二维码!
  8. MySQL基础入门篇
  9. DM 快速分区格式化
  10. ViewModels and LiveData- Patterns + AntiPatterns