Codeforces 题面传送门 & 洛谷题面传送门

提供一个模拟网络流的题解。

首先我们觉得这题一脸可以流的样子,稍微想想可以想到如下建图模型:

  • 建立源点 \(S,T\) 和上下两排点,不妨设上排点为 \(x_1,x_2,\cdots,x_n\),下排点为 \(y_1,y_2,\cdots,y_n\)。
  • 对于每个 \(i\) 我们连一条 \(S\to x_i\),容量为 \(b_i\) 的边,表示每个基站最多提供 \(b_i\) 个网络服务。
  • 对于每个 \(i\),我们连边 \(x_i\to y_i,x_i\to y_{i\bmod n+1}\),权值均为 \(\infty\),表示基站 \(i\) 可以为家庭 \(i\) 和家庭 \(i\bmod n+1\) 提供网络服务。
  • 连边 \(y_i\to T\),权值 \(a_i\),表示家庭 \(i\) 需要 \(a_i\) 个网络服务。

然后跑最大流看看最大流是否等于 \(\sum\limits_{i=1}^na_i\) 即可。

由于此题 \(n\) 高达 \(10^6\),因此直接跑最大流显然是不可取的。因此考虑模拟网络流,也就是用最小割解决最大流的思路。注意到图是一个环形结构,直接做可能会出现后效性有关的问题,因此我们不妨先解决链的情况,即,假设 \(x_n\to y_1\) 的边不存在。设 \(dp_{i,j}(j\in\{0,1\})\) 表示现在只考虑 \(x_1,x_2,\cdots,x_i,y_1,y_2,\cdots,y_i,S,T\) 的导出子图,\(S,T\) 在导出子图中不连通且 \(S\to x_i\) 的边的状态为 \(j\)(\(0\):连上,\(1\):断开)的最小代价,那么有 \(dp_{i,j}=\min\limits_{k\in\{0,1\}}dp_{i-1,k}+kb_i+[j=0\lor k=0]·a_i\),边界条件 \(dp_{0,0}=0\)。

接下来考虑环的情况,其实感觉会了链的情况,环的情况就异常 trivial 了。按照套路枚举 \(S\to x_n\) 的边连上还是断开,设为 \(c\),那么与链的情况不同之处在于,边界条件变为 \(dp_{0,c}=0\),因为 \(S\to x_n\) 的边连上等价于 \(x_n\to y_1\) 的边没有被断开,最后用 \(dp_{n,c}\) 更新答案即可。

时间复杂度线性。

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,63,sizeof(a))
#define pb push_back
#define ppb pop_back
#define mp make_pair
#define mt make_tuple
#define eprintf(...) fprintf(stderr,__VA_ARGS__)
template<typename T1,typename T2> void chkmin(T1 &x,T2 y){if(x>y) x=y;}
template<typename T1,typename T2> void chkmax(T1 &x,T2 y){if(x<y) x=y;}
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned int u32;
typedef unsigned long long u64;
typedef long double ld;
namespace fastio{
#define FILE_SIZE 1<<23
char rbuf[FILE_SIZE],*p1=rbuf,*p2=rbuf,wbuf[FILE_SIZE],*p3=wbuf;
inline char getc(){return p1==p2&&(p2=(p1=rbuf)+fread(rbuf,1,FILE_SIZE,stdin),p1==p2)?-1:*p1++;}
inline void putc(char x){(*p3++=x);}
template<typename T> void read(T &x){
x=0;char c=getchar();T neg=0;
while(!isdigit(c)) neg|=(c=='-'),c=getchar();
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
if(neg) x=-x;
}
template<typename T> void recursive_print(T x){
if(!x) return;
recursive_print(x/10);putc(x%10+'0');
}
template<typename T> void print(T x){
if(!x) putc('0');if(x<0) putc('-'),x=-x;
recursive_print(x);
}
template<typename T> void print(T x,char c){print(x);putc(c);}
void print_final(){fwrite(wbuf,1,p3-wbuf,stdout);}
}
template<typename Tv,int limN,int limM> struct link_list{
int hd[limN+5],nxt[limM+5],item_n=0;Tv val[limM+5];
void clear(){memset(hd,0,sizeof(hd));item_n=0;}//be aware of the TC of memset
void ins(int x,Tv y){val[++item_n]=y;nxt[item_n]=hd[x];hd[x]=item_n;}
};
using namespace fastio;
const int MAXN=1e6;
const ll INF=0x3f3f3f3f3f3f3f3fll;
int n,a[MAXN+5],b[MAXN+5];ll dp[MAXN+5][2];
void solve(){
read(n);ll sum=0,res=INF;
for(int i=1;i<=n;i++) read(a[i]),sum+=a[i];
for(int i=1;i<=n;i++) read(b[i]);
for(int _=0;_<2;_++){
for(int i=0;i<=n;i++) dp[i][0]=dp[i][1]=INF;
dp[0][_]=0;
for(int i=1;i<=n;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++)
chkmin(dp[i][j],dp[i-1][k]+j*b[i]+(!(j&k))*a[i]);
chkmin(res,dp[n][_]);
} //printf("%lld\n",res);
printf("%s\n",(res==sum)?"YES":"NO");
}
int main(){int qu;read(qu);while(qu--) solve();return 0;}

Codeforces 1373F - Network Coverage(模拟网络流)的更多相关文章

  1. Codeforces 738D. Sea Battle 模拟

    D. Sea Battle time limit per test: 1 second memory limit per test :256 megabytes input: standard inp ...

  2. poj 1459 Power Network : 最大网络流 dinic算法实现

    点击打开链接 Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 20903   Accepted:  ...

  3. Codeforces 626A Robot Sequence(模拟)

    A. Robot Sequence time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...

  4. Codeforces 1045. A. Last chance(网络流 + 线段树优化建边)

    题意 给你 \(n\) 个武器,\(m\) 个敌人,问你最多消灭多少个敌人,并输出方案. 总共有三种武器. SQL 火箭 - 能消灭给你集合中的一个敌人 \(\sum |S| \le 100000\) ...

  5. CodeForces - 589D(暴力+模拟)

    题目链接:http://codeforces.com/problemset/problem/589/D 题目大意:给出n个人行走的开始时刻,开始时间和结束时间,求每个人分别能跟多少人相遇打招呼(每两人 ...

  6. Codeforces 767B. The Queue 模拟题

    B. The Queue time limit per test:1 second memory limit per test:256 megabytes input:standard input o ...

  7. Power Network (poj 1459 网络流)

    Language: Default Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 23407   ...

  8. codeforces 546E. Soldier and Traveling 网络流

    题目链接 给出n个城市, 以及初始时每个城市的人数以及目标人数.初始时有些城市是相连的. 每个城市的人只可以待在自己的城市或走到与他相邻的城市, 相邻, 相当于只能走一条路. 如果目标状态不可达, 输 ...

  9. codeforces 510E. Fox And Dinner 网络流

    题目链接 给出n个人, 以及每个人的值, 要求他们坐在一些桌子上面, 每个桌子如果有人坐, 就必须做3个人以上. 并且相邻的两个人的值加起来必须是素数.每个人的值都>=2. 由大于等于2这个条件 ...

随机推荐

  1. SpringCloud 2020.0.4 系列之 Feign

    1. 概述 老话说的好:任何问题都有不止一种的解决方法,当前的问题没有解决,只是还没有发现解决方法,而并不是无解. 言归正传,之前我们聊了 SpringCloud 的服务治理组件 Eureka,今天我 ...

  2. Beta-功能规格说明书

    项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-计划-功能规格说明书 一.引言 1. 项目简介 项目团队:删库跑路对不队 项目名称:题士 项目内容 ...

  3. Go语言核心36讲(Go语言进阶技术八)--学习笔记

    14 | 接口类型的合理运用 前导内容:正确使用接口的基础知识 在 Go 语言的语境中,当我们在谈论"接口"的时候,一定指的是接口类型.因为接口类型与其他数据类型不同,它是没法被实 ...

  4. Java基础之原生JDBC操作数据库

    前言 日常开发中,我们都习惯了使用ORM框架来帮我们操作数据库,本文复习.记录Java如何使用原生JDBC操作数据库 代码编写 封装几个简单方法 find查询方法 findOne查询方法 update ...

  5. 攻防世界 杂项 4.something_in_image

    这是原题 我这里使用编辑器打开,一看乱码也挺多的,于是想了想ctrl+f搜索一下flag关键字吧,结果答案出来了(flag不少,多搜索几次) Flag{yc4pl0fvjs2k1t7T}

  6. Python import Queue ImportError: No module named 'Queue'

    python3 中引入Queue 会报出这个问题 python3 中这样引入 import queue python2 中这样引入 import Queue 为了兼容 可以这样 import sys ...

  7. Wedding DJ题解 (回归OI)

    写在前面 高考结束了, 很遗憾, 我是其中的失败者, zzu, 没有想过最后来到这个学校, 并且还是信息安全专业, 不过, 时间久了, 也慢慢适应了: 当我被这个学校的这个专业录取, 也就注定着, 我 ...

  8. MySQL报错汇总[10/29更新]

  9. mysql数据库导入导出文件sql文件

    window下 1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u dbuser -p dbname > dbname.sql ...

  10. 重新整理 .net core 实践篇——— filter[四十四]

    前言 简单介绍一下filter 正文 filter 的种类,微软文档中写道: 每种筛选器类型都在筛选器管道中的不同阶段执行: 授权筛选器最先运行,用于确定是否已针对请求为用户授权. 如果请求未获授权, ...