Shoot the Bullet 【ZOJ - 3229】【有源汇有上下界最大流】

2023-11-08

题目链接


  题意:有N天,M个妹纸,接下来是一行共M个数,表示M个妹纸要求你在N天内总共给他们拍摄至少Gi个照片。然后有N天,每天有个Ci和Di,表示今天有Ci个妹纸要拍摄,但是今天最多拍摄Di张照片,然后是Ci个妹纸,第一个是妹纸的编号,0~M-1,然后是L~R,表示这个妹纸要求你最少拍L张照片,最多拍R张。

  这道题,由于我ISAP的退出的顶端高度没有写好,竟然WA了几十次,加上一整个晚上的自闭。

  终于,我给我的顶端加了1,过了。这里ISAP的高度必须是结点数+1,而又有结点数是从0开始的,所以,我们必须将更新更新为0~node+2,为什么是“node + 2”,因为node + 2,是第一个不可行的高度。必须初始化到node + 2。

  关于ISAP的方面就讲那么多了,接下去是关于这道题的解题思路了。

  首先,每个妹纸至少总共拍Gi张照片,也就是确定了下限是Gi,所以在这里要先处理下限;

  再则,每天至少0张,至多Di张照片,我们得知了上限;

  然后,每个妹纸每天拍Li~Ri张照片,说明的是有上下限。

  于是,根据上述几则条例,我们可以确定如何建图,然后就是直接跑一个最大流即可,最大流*2是否等于|入流 - 出流|总和,是判断有无解的标准。

  有解的时候,我们删除超级源汇点,将原来的源点和汇点变成现在的源汇点,再跑一次最大流,即可得知每条边的流量,加上下限,也就是每条边的实际流了。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x7f7f7f7f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 1505, maxM = 8e5 + 7;
int N, M, head[maxN], cnt, du[maxN], _Index, line[maxM], fl[maxM], sum;
struct Eddge
{
    int nex, to, flow;
    Eddge(int a=-1, int b=0, int c=0):nex(a), to(b), flow(c) {}
}edge[maxM];
inline void addEddge(int u, int v, int f)
{
    edge[cnt] = Eddge(head[u], v, f);
    head[u] = cnt++;
}
inline void _add(int u, int v, int f) { addEddge(u, v, f); addEddge(v, u, 0); }
struct ISAP
{
    int S, T, gap[maxN], cur[maxN], deep[maxN], que[maxN], ql, qr;
    inline void init()
    {
        for(int i=0; i<=T + 2; i++)
        {
            gap[i] = deep[i] = 0;
            cur[i] = head[i];
        }
        ++gap[deep[T] = 1];
        que[ql = qr = 1] = T;
        while(ql <= qr)
        {
            int u = que[ql ++];
            for(int i=head[u], v; ~i; i=edge[i].nex)
            {
                v = edge[i].to;
                if(!deep[v]) { ++gap[deep[v] = deep[u] + 1]; que[++qr] = v; }
            }
        }
    }
    inline int aug(int u, int Flow)
    {
        if(u == T) return Flow;
        int flow = 0;
        for(int &i = cur[u], v; ~i; i=edge[i].nex)
        {
            v = edge[i].to;
            if(deep[u] == deep[v] + 1)
            {
                int tmp = aug(v, min(edge[i].flow, Flow));
                flow += tmp; Flow -= tmp; edge[i].flow -= tmp; edge[i ^ 1].flow += tmp;
                if(!Flow) return flow;
            }
        }
        if(!(--gap[deep[u]])) deep[S] = T + 2;
        ++gap[++deep[u]]; cur[u] = head[u];
        return flow;
    }
    inline int Max_Flow()
    {
        init();
        int ret = aug(S, INF);
        while(deep[S] <= T + 1) ret += aug(S, INF);
        return ret;
    }
} mf;
inline void init()
{
    cnt = 0; mf.S = N + M + 2; mf.T = N + M + 3; _Index = 0; sum = 0;
    for(int i=0; i<=N + M + 3; i++) { head[i] = -1; du[i] = 0; }
}
int main()
{
    while(scanf("%d%d", &N, &M) != EOF)
    {
        init();
        int s = 0, t = N + M + 1;
        for(int i=1, Gi; i<=M; i++)
        {
            scanf("%d", &Gi);
            _add(i + N, t, INF);
            du[i + N] -= Gi; du[t] += Gi;
        }
        for(int day = 1, Ci, Di; day <= N; day++)
        {
            scanf("%d%d", &Ci, &Di);
            _add(s, day, Di);
            for(int i=1, id, l, r; i<=Ci; i++)
            {
                scanf("%d%d%d", &id, &l, &r); id += N + 1;
                _add(day, id, r - l);
                du[day] -= l; du[id] += l;
                line[++_Index] = cnt - 1; fl[_Index] = l;
            }
        }
        for(int i=0; i<=t; i++)
        {
            if(du[i] > 0)
            {
                _add(mf.S, i, du[i]);
                sum += du[i];
            }
            else if(du[i] < 0)
            {
                _add(i, mf.T, -du[i]);
                sum -= du[i];
            }
        }
        _add(t, s, INF);
        if(mf.Max_Flow() * 2 != sum) { printf("-1\n\n"); continue; }
        head[mf.S] = head[mf.T] = -1;
        mf.S = s; mf.T = t;
        printf("%d\n", mf.Max_Flow());
        for(int i=1; i<=_Index; i++)
        {
            printf("%d\n", fl[i] + edge[line[i]].flow);
        }
        printf("\n");
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shoot the Bullet 【ZOJ - 3229】【有源汇有上下界最大流】 的相关文章

  • Connections between cities 【HDU - 2874】【在线LCA算法】

    题目链接 昨天刚学了在线LCA 今天就来硬刚这道题还是花了一整天的时间 不过对于LCA却有了更多的理解 这道题在讲述不同根的做法上尤其是很好的 题目告诉我们有N个节点和M条边 以及C次询问 每次查询的是 L R 这两个节点间的距离 还是算得
  • LeetCode-Python-1584. 连接所有点的最小费用(MST)

    给你一个points 数组 表示 2D 平面上的一些点 其中 points i xi yi 连接点 xi yi 和点 xj yj 的费用为它们之间的 曼哈顿距离 xi xj yi yj 其中 val 表示 val 的绝对值 请你返回将所有点
  • True Liars 【POJ - 1417】【种类并查集+0-1背包】

    题目链接 题目想要知道有P个好人 说真话的人 和Q个坏人 说假话的人 并且有N条信息 代表A说B是好人 yes 坏人 no 那么 在保证答案唯一的情况下输出这P个好人 并且最后的时候输出 end 否则 输出 no 坑点 答案唯一指的是最后你
  • hdu 2586 How far away ?

    Problem acm hdu edu cn showproblem php pid 2586 Meaning 给一棵 n 个点的树 和 n 1 条边的边权 多次询问树上两点的距离 Analysis 以任意顶点为根 DFS 预处理出所有结点
  • lambda

    外部变量访问方式说明符 不捕获任何变量 以引用方式捕获所有变量 用值的方式捕获所有变量 可能被编译器优化为const foo 以引用捕获foo 但其余变量都靠值捕获 foo 以值捕获foo 但其余变量都靠引用捕获 bar 以值方式捕获bar
  • Supermarket 【POJ - 1456】【并查集+哈希表思想+贪心】

    题目链接 原来 并查集还有这样的作用 题记 我想用个哈希表的思维来解这道题 但是 显然O N 2 的哈希表去查询并插入显然是不行的 那么既然挂在图论专题 我就得用相应的方式解答咯 要是不挂在图论专题 我可能会自闭了 我们对于每个物品按照价值
  • Road Construction POJ - 3352(tarjan双连通缩点模板)

    题目描述 给一个无向连通图 至少添加几条边使得去掉图中任意一条边不改变图的连通性 即使得它变为边双连通图 include
  • 图论17(Leetcode864.获取所有钥匙的最短路径)

    用二进制表示获得的钥匙 假设n 钥匙个数 000000000代表没有钥匙 0000000001代表有idx为1的钥匙 0000000011代表有idx 1 2的钥匙 这方法巧妙又复杂 代码 class Solution static int
  • 大学生团体天梯赛(第十届)

    题目地址 天梯赛 include
  • PCL点云处理之批量读写点云、随机赋予颜色 并保存

    include
  • 矩阵树定理

    启蒙 http zhengruioi com contest 1416 T1 T2的10分暴力 后面是论文科技 不搞了 https www luogu com cn problem P6178 O n 3
  • [UVA1364

    评测地址 网址1 网址2 题目描述 题意 给出n位骑士 然后有m个关系 每个关系以格式 a b a b a b给出 表达骑士 a a
  • 《算法图解》读书笔记(二)

    第六章 图 广度优先搜索 1 解决最短路径问题 shortest path problem 的算法被称为广度优先搜索 breadth first search 2 图由节点 node 和边 edge 组成 一个节点可能与众多节点直接相连 这
  • [NOI 2015复习][BZOJ 1509][NOI 2003]逃学的小孩(树的直径)

    题目链接 http www lydsy com JudgeOnline problem php id 1509 题目大意 要从一棵树中找出三个点 X Y Z X Y Z 使得 min dis A C dis B C dis A B min
  • King's Quest【POJ 1904】【Tarjan强连通分量】

    Once upon a time there lived a king and he had N sons And there were N beautiful girls in the kingdom and the king knew
  • 【codeforces #290(div 1)】ABC题解

    A Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard o
  • 1600*B. pSort(并查集)

    解析 并查集 将能够交换的位置相连 查看对应的位置能够交换 include
  • Binary Tree on Plane【费用流】

    题目链接 CF 277 E 题意翻译 给你平面上 n 个点 2 n 400 要求用这些点组成一个二叉树 每个节点的儿子节点不超过两个 定义每条边的权值为两个点之间的欧几里得距离 求一个权值和最小的二叉树 并输出这个权值 其中 点 i 可以成
  • 坐标前后限制转点的坐标取值+网络流拆维拆点:agc031_e

    https vj imken moe contest 598718 problem J 观察到数据范围很小 但一个很重要的信息我们缺失了 就是珠宝的数量 所以我们考虑枚举珠宝的数量 k k k 对于横纵坐标什么至多至少的限制 比如 a i
  • 860.染色法判定二分图

    二分图是指一个图中的所有顶点可以分为两部分 并且每条边连接的是属于不同部分的两个顶点 include

随机推荐

  • SpringCloud

    文章目录 微服务架构 SpringCloud 二 上篇SpringCloud本Cloud 1 SpringCloud的命名规则及版本关系 1 1 springboot与springcloud的版本依赖 1 2 本次博文使用的环境及版本 2
  • 浅谈NB-IOT模块调试

    背景 在物联网的口号下 我们公司也有幸踏足NB物联这块 当然也只是二次应用开发 NB核心开发技术都掌握在几个大公司大佬手里 例如 华为海思 高通 intel 当然模块 厂商又例如 移远 ublox等 芯片的资料和技术不像Lora这样开源 所
  • python实现字符串匹配算法BF,BF改,KMP

    包含 BF BF改进版本 KMP BF 暴力搜索 BF改 当判断匹配失败的字符串是不是与首字母相同 若不同 继续BF算法 若相同 直接将首字母移到当前位置 KMP 通过前缀与后缀发现待匹配字符串本身的特性 匹配失败时一次性移动多个字符以减少
  • python三维数组切片

    使用np random randint创建一个 3 4 5 的三维随机数组 利用切片返回 如下图位置的数
  • 文件上传封装与使用

    组件封装
  • Linux下Fork与Exec使用

    老邮局 琼楼挂月钓流云 梦里瑶台暂借春 Linux下Fork与Exec使用 一 引言 对于没有接触过Unix Linux操作系统的人来说 fork是最难理解的概念之一 它执行一次却返回两个值 fork函数是Unix系统最杰出的成就之一 它是
  • 白帽,黑帽,灰帽,绿帽!一文了解黑客的所有信息

    前言 您是否想过黑客有许多不同的类型 是什么因素促使他们学习黑客技能 当我想到黑客时 我都会想到下面这张图片 那就是黑客的形象 那你呢 文末有彩蛋 网络可以说是有史以来最重要的战场 这里没有国界 也没有有组织的军队 在线网络战场是善恶之间最
  • ucosII 下iic 的使用问题(含解决方式)

    今天在将SGP30气体传感器的代码移植到ucosii中使用时遇到了输出数据一直为65535的情况 分析现象 开始以为是硬件问题 元器件损坏等原因 使用了裸核代码进行测试 能够正常读取相应参数说明硬件正常 ucos跑死了 增加led显示任务
  • 机器学习笔试题一

    1 输入图片大小为200 200 依次经过一层卷积 kernel size 5 5 padding 1 stride 2 pooling kernel size 3 3 padding 0 stride 1 又一层卷积 kernel siz
  • @Autowired三种注入方式的区别以及@Inject注解的基本使用

    文章目录 Autowired三种注入方式的区别 Autowired三种注入方式 1 构造器注入 lombok注解实现构造器注入 2 setter注入 3 属性注入 问题一 问题二 总结 使用 Inject 代替 Autowired 参考 A
  • 彻底搞清楚javascript中的require、import和export

    为什么有模块概念 理想情况下 开发者只需要实现核心的业务逻辑 其他都可以加载别人已经写好的模块 但是 Javascript不是一种模块化编程语言 在es6以前 它是不支持 类 class 所以也就没有 模块 module 了 require
  • 【大模型】在linux上使用nvidia显卡,使用llam.cpp框架运行Baichuan-7B 模型,可以成功运在CPU和GPU下运行,int4量化版本速度飞快。

    1 先下载模型Baichuan 7B 找到个网站可以快速的下载模型 https aliendao cn models baichuan inc Baichuan 7B pytorch model bin 13 0 GB Baichuan 7
  • 常用jquery 方法

    注意点 使用jquer时时刻注意此时是jquery 对象 而非dom对象 在调用相关方法 属性时 注意不用与dom对象混用 导致调用失败 一 IFRAME相关调用知识 摘自 http java my life iteye com blog
  • python学习-GUI

    图形用户界面和游戏开发 一 基于tkinter模块的GUI 在python中的默认GUI开发模块是tkinter 还有其他的模块wxPython PyQt PyGTK等 基于tkinter开发的GUI应用以下5个步骤 导入tkinter模块
  • "undefined reference to" 问题解决方法

    最近在 Linux 下编程发现一个诡异的现象 就是在链接一个静态库的时候总是报错 类似下面这样的错误 text 0x13 undefined reference to func 关于undefined reference 这样的问题 大家其
  • nmap常用命令

    nmap 命令 1 nmap sT 192 168 96 4 TCP连接扫描 不安全 慢 2 nmap sS 192 168 96 4 SYN扫描 使用最频繁 安全 快 3 nmap Pn 192 168 96 4 目标机禁用ping 绕过
  • Unity中触摸和鼠标操作的几个问题

    关键点1 在unity中touch事件同时也会触发GetMouseButton事件 有时候可能会给你带来方便 但是如果没有意识到这个问题的话 也很可能给你带来很大的麻烦 关键点2 触摸操作也可以使用Input GetAxis Mouse X
  • 自动调用拷贝构造函数的三种情况

    自动调用拷贝构造函数的三种情况 首先介绍拷贝构造函数的定义形式 class 类名 public 构造函数名称 类名 变量名 函数体 拷贝构造函数是使用类对象的引用作为参数的构造函数 它能够将参数的属性值拷贝给新的对象 完成对新对象的初始化
  • 增减序列

    增减序列 https www acwing com problem content 102 给定一个长度为 n 的数列 a1 a2 an 每次可以选择一个区间 l r l r 使下标在这个区间内的数都加一或者都减一 求至少需要多少次操作才能
  • Shoot the Bullet 【ZOJ - 3229】【有源汇有上下界最大流】

    题目链接 题意 有N天 M个妹纸 接下来是一行共M个数 表示M个妹纸要求你在N天内总共给他们拍摄至少Gi个照片 然后有N天 每天有个Ci和Di 表示今天有Ci个妹纸要拍摄 但是今天最多拍摄Di张照片 然后是Ci个妹纸 第一个是妹纸的编号 0