题目链接:点击查看

题目大意:给出 n 个数字,现在有四种药水:

  1. 选择一棵高度为a0的植物变为b0高度的植物
  2. 选择一棵高度在[a1,a2]区间内的植物变为b1高度的植物
  3. 选择一棵高度为a1的植物变为[b1, b2]区间内某一高度的植物
  4. 选择一棵高度在[a1,a2]区间内的植物变为[b1,b2]区间内某一高度的植物

接下来给出 m 次说明,用来描述上面四种药水,问最多能让多少棵植物达到高度 k

题目分析:根据数据范围和题目描述,不难想到用最大流来做,这个题的考察点就是需要设置限流点对流量进行限流,直接说如何建边吧,下面以 limit 代表限流点,每个点代表每个权值下的点

  1. 源点 -> 每个点,流量为初始时的数字情况
  2. 对每个药水:
    1. 起始点 a -> limit_1,流量为 inf
    2. limit_1 -> limit_2,流量为 c
    3. limit_2 -> 转换后的点 b,流量为 inf
  3. 点 k -> 汇点,流量为 inf

然后跑最大流就是答案了,不过至于点的计算我也不太会算,反正数组能开多大就开多大吧

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e3+100;int limit=100;int tot[N];struct Edge
{int to,w,next;
}edge[N*N];//边数int head[N],cnt;void addedge(int u,int v,int w)
{edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;edge[cnt].to=u;edge[cnt].w=0;//反向边边权设置为0edge[cnt].next=head[v];head[v]=cnt++;
}int d[N],now[N];//深度 当前弧优化bool bfs(int s,int t)//寻找增广路
{memset(d,0,sizeof(d));queue<int>q;q.push(s);now[s]=head[s];d[s]=1;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(d[v])continue;if(!w)continue;d[v]=d[u]+1;now[v]=head[v];q.push(v);if(v==t)return true;}}return false;
}int dinic(int x,int t,int flow)//更新答案
{if(x==t)return flow;int rest=flow,i;for(i=now[x];i!=-1&&rest;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(w&&d[v]==d[x]+1){int k=dinic(v,t,min(rest,w));if(!k)d[v]=0;edge[i].w-=k;edge[i^1].w+=k;rest-=k;}}now[x]=i;return flow-rest;
}void init()
{memset(tot,0,sizeof(tot));memset(now,0,sizeof(now));memset(head,-1,sizeof(head));cnt=0;
}int solve(int st,int ed)
{int ans=0,flow;while(bfs(st,ed))while(flow=dinic(st,ed,inf))ans+=flow;return ans;
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--){init();int n,m,k;scanf("%d%d%d",&n,&m,&k);int st=N-1,ed=st-1;for(int i=1;i<=n;i++){int h;scanf("%d",&h);tot[h]++;}for(int i=1;i<k;i++)addedge(st,i,tot[i]);addedge(k,ed,inf);while(m--){int op;scanf("%d",&op);if(op==1){int a,b,c;scanf("%d%d%d",&c,&a,&b);addedge(a,b,c);}else if(op==2){int a1,a2,b1,c;scanf("%d%d%d%d",&c,&a1,&a2,&b1);limit++;for(int i=a1;i<=a2;i++)addedge(i,limit,inf);addedge(limit,b1,c);}else if(op==3){int a1,b1,b2,c;scanf("%d%d%d%d",&c,&a1,&b1,&b2);limit++;addedge(a1,limit,c);for(int i=b1;i<=b2;i++)addedge(limit,i,inf);}else{int a1,a2,b1,b2,c;scanf("%d%d%d%d%d",&c,&a1,&a2,&b1,&b2);limit++;for(int i=a1;i<=a2;i++)addedge(i,limit,inf);limit++;addedge(limit-1,limit,c);for(int i=b1;i<=b2;i++)addedge(limit,i,inf);}}printf("%d\n",solve(st,ed));}return 0;
}

牛客 - 养花(最大流)相关推荐

  1. 牛客网扫地僧开源出来的《Java 面试无敌流笔记》,Github 上线两天就爆火

    为什么要公开这些面试题? 原因一:身边从事 Java 开发的人员越来越多,我的表弟表妹们,朋友的表弟表妹们,朋友的朋友的表弟表妹们,每次问我要相同的面试复习材料,已经让我疲于应付,索性整理出来,直接发 ...

  2. 带权二分图匹配(最小费用最大流) 8.2牛客暑期多校训练营五 E

    E.room | 时间限制:1 秒 | 内存限制:256M Nowcoder University has 4n students and n dormitories ( Four students ...

  3. 8-10 牛客网刷题知识点集合

    在关系代数运算中,五种基本运算为 ? 并.差.选择.投影.笛卡尔乘积      ( + - * 选择 投影) 关于OSI参考模型的描述中,正确的是? 按功能可以分为7个层次 OSI参考模型 自下而上: ...

  4. 牛客国庆集训派对Day6

    牛客国庆集训派对Day6 以下是我个人题解,出题人题解附带在最后 A.Birthday 费用流裸题,只要注意到1+3+5+...+2k−1=k21+3+5+...+2k-1 = k^21+3+5+.. ...

  5. Java面试题 22 牛客 Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持

    Java面试题 22 牛客 Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持,下面关于Java反射的描述,哪些是错误的:(          ) A Java反射主要涉及的类如C ...

  6. Java面试题17 牛客 下面哪个选项正确创建socket连接?

    Java面试题17 牛客 下面哪个选项正确创建socket连接? Socket s = new Socket(8080); Socket s = new Socket("192.168.1. ...

  7. 牛客网 OI 赛制测试赛

    比赛链接:这里写链接内容 A 斐波那契 链接:https://www.nowcoder.com/acm/contest/181/A 来源:牛客网 设f[i]表示斐波那契数论的第i项 f[1]=1,f[ ...

  8. Day5.牛客网剑指offer 67题之43-54题(java代码)

    文章目录 Day5.牛客网剑指offer 67题之43-54题 43.左旋转字符串 44.翻转单词顺序列 45.扑克牌顺序 46.孩子们的游戏 47.求1+2+...+n 48.不用加减乘除做加法 4 ...

  9. 大数据与云计算——牛客网大数据面试问题总结

    本文是个人从牛客网中的大数据的面试的面经中筛选出来与大数据的的相关的面试的问题:包括以下的技术栈: Flume Zookeeper Hbase Hive Hadoop  Spark Flink  HD ...

最新文章

  1. iptables 基本命令使用举例
  2. ORA-14452的出现原因解析及解决方法
  3. mysql1067默认参数错误_MySQL 1067错误解决方法集合
  4. 换晶振导致stm32串口数据飞码的解决办法(补充)
  5. 2021云栖大会,打卡IoT最全攻略
  6. VUE data传值
  7. img解包工具_3、Linux基础命令篇、压缩打包工具
  8. koa2入门(3)mongoose 增删改查
  9. javafx 图标_JavaFX技巧32:需要图标吗? 使用Ikonli!
  10. NOIP模拟测试10「大佬·辣鸡·模板」
  11. 在Microsoft System Center中利用您的现有投资管理VMware--Veeam MP v6.5
  12. mysql 设置 server id_MySQL中如何设置 auto_increment 重新计数 主键id从1开始
  13. PCL1.8.0/ Qt5.7.0开发环境配置
  14. 【科普篇】推荐系统之矩阵分解模型
  15. Firefox浏览器无法安装firebug和firepath插件问题解决
  16. 【渝粤教育】电大中专药理学基础 (2)_1作业 题库
  17. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day30】—— 设计模式1
  18. 学游戏设计有前途吗?
  19. 一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(二)进一步优化,公差分析
  20. 08-20210305在WIN10下通过网口给华为海思Hi3516DV300刷机(鸿蒙系统)

热门文章

  1. 自动设置图片的序号_巧用word软件中的题注功能,让你插入的对象自动排序与更新...
  2. 配置MySQL8.0
  3. SpringAMQP--发布订阅模型介绍
  4. 排序、翻页、函数计算问题
  5. Maven的依赖管理
  6. MybatisPlus实现条件查询
  7. logback 的过滤器和异步日志和自定义 logger
  8. AdminLTE介绍
  9. 通过docker的方式进行RocketMQ的安装
  10. 设计模式之_Iterator_02