题目链接:点击查看

题目大意:一共有 n 天,每天可以拍最多 D[ i ] 张照片,每天可以选择 C[ i ] 个少女进行拍照,每个少女的编号为 T[ i ][ j ] ,每个少女需要拍摄照片的区间为 [ L[ i ][ j ] , R[ i ][ j ] ] ,最后每个少女的照片至少需要拍 G[ i ] 张,问满足上述情况下,最多能拍多少张照片

题目分析:题目有点难读,虽然是中文题面,但提到的变量实在是太多了。。

读懂题后稍微建一下图发现是一个有源汇有上下界的最大流问题,套一下模板就好了,建图方式如下:

需要注意的是,处理此类问题(有上下界的最大流)时,不要加当前弧优化,加了就会反向优化,跑的反而会更慢

代码:

#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<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e6+100;const int M=1e6+100;int du[N];//入度 struct Edge
{int to,w,next;
}edge[M];//边数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++;
}void add(int u,int v,int lower,int upper)
{addedge(u,v,upper-lower);du[u]-=lower,du[v]+=lower;
}int d[N];//深度bool bfs(int s,int t)//寻找增广路
{memset(d,0,sizeof(d));queue<int>q;q.push(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;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=head[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;}}return flow-rest;
}void init()
{memset(du,0,sizeof(du));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("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n,m;while(scanf("%d%d",&n,&m)!=EOF){init();int st=N-1,ed=st-1,s=n+m+1,t=n+m+2;for(int i=1;i<=m;i++){int num;scanf("%d",&num);add(i+n,t,num,inf);}for(int i=1;i<=n;i++){int C,D;scanf("%d%d",&C,&D);add(s,i,0,D);while(C--){int id,l,r;scanf("%d%d%d",&id,&l,&r);id++;add(i,id+n,l,r);}}int sum=0;for(int i=1;i<=n+m+2;i++){if(du[i]>0){addedge(st,i,du[i]);sum+=du[i];}elseaddedge(i,ed,-du[i]);}addedge(t,s,inf);if(solve(st,ed)!=sum)puts("-1\n");else{int ans=edge[cnt-1].w;edge[cnt-1].w=edge[cnt-2].w=0;printf("%d\n\n",ans+solve(s,t));}}return 0;
}

洛谷 - P5192 Zoj3229 Shoot the Bullet|东方文花帖|【模板】有源汇上下界最大流(有源汇有上下界的最大流)相关推荐

  1. 有上下界网络流 ---- Zoj3229 Shoot the Bullet|东方文花帖|【模板】有源汇上下界最大流

    学习资料+题目链接 题目大意: 模板讲解 #include <bits/stdc++.h> #define mid ((l + r) >> 1) #define Lson rt ...

  2. 东方文花帖无敌修改器制作思路

    有人问到像文花帖这样没有残机数,一死就重置的游戏怎么做无敌功能,我想了下好像没有什么好办法,不过凭着前作的经验可以先找到玩家指针,然后找到玩家逻辑函数,看出玩家状态偏移量,就可以找到miss函数了 首 ...

  3. 洛谷——P2590 [ZJOI2008]树的统计(树链剖分模板练手)

    P2590 [ZJOI2008]树的统计 I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问 ...

  4. 洛谷 P1506 拯救oibh总部 题解(洪水填充法的模板)

    目录 题目背景 题目描述 输入格式 输出格式 输入输出样例 hack: 说明/提示 总结 题目背景 oibh 总部突然被水淹没了!现在需要你的救援-- 题目描述 oibh 被突来的洪水淹没了,还好 o ...

  5. (差分)洛谷P4231 三步必杀

    洛谷P4231 三步必杀 三步必杀 题目背景 (三)旧都 离开狭窄的洞穴,眼前豁然开朗. 天空飘着不寻常的雪花. 一反之前的幽闭,现在面对的,是繁华的街市,可以听见酒碗碰撞的声音. 这是由被人们厌恶的 ...

  6. (树状数组+逆元)洛谷P5142 区间方差

    洛谷P5142 区间方差 (^ w ^) 题目背景 出题人并没有能力写有趣的题面-- 题目描述 对于一个长度为n的序列a1,a2,a3⋯ana_1,a_2,a_3\cdots a_na1​,a2​,a ...

  7. 【洛谷月赛】洛谷三月月赛题解报告

    昨天就是洛谷三月月赛,小编考的并不好,才31分,隔壁大佬50分,于是小编决定改一改题,先看第一题: P5238 整数校验器 题目描述 有些时候需要解决这样一类问题:判断一个数 x 是否合法. x 合法 ...

  8. 洛谷P3352 [ZJOI2016]线段树

    P3352 [ZJOI2016]线段树 (^ w ^) 题目描述 小Yuuka遇到了一个题目:有一个序列a_1,a_2,?,a_n,q次操作,每次把一个区间内的数改成区间内的最大值,问最后每个数是多少 ...

  9. 洛谷专题训练 ——【算法1-1】模拟与高精度

    洛谷题单[算法1-1]模拟与高精度 ACM-ICPC在线模板 题单链接: [算法1-1]模拟与高精度 下面的这一坨都是洛谷题单上的东东 题单简介 恭喜大家完成了第一部分语言入门,相信大家已经可以使用 ...

最新文章

  1. 小米云能同步到华为手机上吗_有没有小米还没涉足的产业?对标百度网盘,小米云盘即将上线...
  2. 项目管理ppt_「PPT」几近满分的项目管理PPT干货
  3. 简单分解帮助看清复杂问题
  4. CF Round410 D. Mike and distribution
  5. Mysql存储引擎中InnoDB与Myisam的区别
  6. 直击标贝科技WAIC2019:深耕语音合成与数据服务 助力语音场景完美落地
  7. 个人作业-软件产品案例分析
  8. 同济大学微型计算机原理实验报告,同济大学微机原理实验报告.doc
  9. 7 款神秘的开源中间件!
  10. 游戏开发学什么?四步修炼骨灰级高手
  11. Android技术分享| 超简单!给 Android WebRTC增加美颜滤镜功能
  12. iview中Cascader组件的坑
  13. Bingo说说:私域创富之万能获客法,一招吃遍天下
  14. android 经验进度条,android ProgressBar(进度条)
  15. W3C school
  16. 想跳槽涨薪的必看,Java就业指导(1)
  17. GDB使用手册(四)、GDB命令
  18. 对Android中arm64-v8a、armeabi-v7a、armeabi、x86认识
  19. ps基础 图层 选框工具 简单 icon 制作
  20. [Win32]纯资源DLL

热门文章

  1. 用java做出两行三列的表格_Java中,使用HSSFSheet创建excel模板如何创建一列两行的数据?...
  2. rocksdb写放大_Rocksdb的优劣及应用场景分析
  3. qt5使用触屏 偶尔没响应_Qt5+VS2015编程入门示例及注意事项——打印九九乘法表...
  4. 使用StringRedisTemplate和RedisTemplate
  5. MySQL高级 - insert优化
  6. EventLoop 与Channel 的关联
  7. 线程的应用-继承Thread类创建线程
  8. 字节流读数据(一次读一个字节数组数据)
  9. SpringMVC的请求-获得请求参数-获得集合类型参数1
  10. 代码演示:获取锁时被中断