Codeforces 1373F - Network Coverage(模拟网络流)
提供一个模拟网络流的题解。
首先我们觉得这题一脸可以流的样子,稍微想想可以想到如下建图模型:
- 建立源点 \(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(模拟网络流)的更多相关文章
- Codeforces 738D. Sea Battle 模拟
D. Sea Battle time limit per test: 1 second memory limit per test :256 megabytes input: standard inp ...
- poj 1459 Power Network : 最大网络流 dinic算法实现
点击打开链接 Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 20903 Accepted: ...
- Codeforces 626A Robot Sequence(模拟)
A. Robot Sequence time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...
- Codeforces 1045. A. Last chance(网络流 + 线段树优化建边)
题意 给你 \(n\) 个武器,\(m\) 个敌人,问你最多消灭多少个敌人,并输出方案. 总共有三种武器. SQL 火箭 - 能消灭给你集合中的一个敌人 \(\sum |S| \le 100000\) ...
- CodeForces - 589D(暴力+模拟)
题目链接:http://codeforces.com/problemset/problem/589/D 题目大意:给出n个人行走的开始时刻,开始时间和结束时间,求每个人分别能跟多少人相遇打招呼(每两人 ...
- Codeforces 767B. The Queue 模拟题
B. The Queue time limit per test:1 second memory limit per test:256 megabytes input:standard input o ...
- Power Network (poj 1459 网络流)
Language: Default Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 23407 ...
- codeforces 546E. Soldier and Traveling 网络流
题目链接 给出n个城市, 以及初始时每个城市的人数以及目标人数.初始时有些城市是相连的. 每个城市的人只可以待在自己的城市或走到与他相邻的城市, 相邻, 相当于只能走一条路. 如果目标状态不可达, 输 ...
- codeforces 510E. Fox And Dinner 网络流
题目链接 给出n个人, 以及每个人的值, 要求他们坐在一些桌子上面, 每个桌子如果有人坐, 就必须做3个人以上. 并且相邻的两个人的值加起来必须是素数.每个人的值都>=2. 由大于等于2这个条件 ...
随机推荐
- 无网环境安装docker之--rpm
总体思路:找一台可以联网的linux,下载docker的RPM依赖包而不进行安装(yum localinstall),将所有依赖的rpm环境打包好,再在无网环境中解压逐一安装(rpm: --forc ...
- FastAPI 学习之路(四十六)WebSockets(二)
上一篇文章,我们分享了WebSockets一些入门的,我们这节课,在原来的基础上,对于讲解的进行一个演示.我们最后分享了依赖token等.首先我们对上次的代码进行调整. 我们之前分享FastAPI 学 ...
- 【数据结构与算法Python版学习笔记】递归(Recursion)——优化问题与策略
分治策略:解决问题的典型策略,分而治之 将问题分为若干更小规模的部分 通过解决每一个小规模部分问题,并将结果汇总得到原问题的解 递归算法与分治策略 递归三定律 体现了分支策略 应用相当广泛 排序 查找 ...
- 【数据结构与算法Python版学习笔记】树——平衡二叉搜索树(AVL树)
定义 能够在key插入时一直保持平衡的二叉查找树: AVL树 利用AVL树实现ADT Map, 基本上与BST的实现相同,不同之处仅在于二叉树的生成与维护过程 平衡因子 AVL树的实现中, 需要对每个 ...
- nsq - 一条消息的生命周期(一)
经过前面几篇的学习,相信大家对nsq已经有了一个大概的了解,我在写这篇文章的时候也看了很多其他人写的教程,发现大家对于分析系统每个点写的很不错,但是都很少有整体串起来一起走一遍,所以,我打算分成2-3 ...
- django 中的hello word 开心,通过申请博客了,,发个随笔庆祝一下~~~~~~~
django 中的hello word! 准备:[pymsql,pycharm,django3.0.7] >>>终端中:django-admin.py startproject [项 ...
- Java:ConcurrentHashMap类小记-1(概述)
Java:ConcurrentHashMap类小记-1(概述) 对 Java 中的 ConcurrentHashMap类,做一个微不足道的小小小小记,分三篇博客: Java:ConcurrentHas ...
- 【二食堂】Alpha - Scrum Meeting 3
Scrum Meeting 3 例会时间:4.13 12:00 - 12:30 进度情况 组员 昨日进度 今日任务 李健 1. 继续学习前端知识,寻找一些可用的框架.issue 1. 搭建主页html ...
- 设计AOV网拓扑排序的算法
拓扑排序 对一个有向图构造拓扑序列的过程称为拓扑排序(不唯一) 思想 从AOV网选择一个没有前驱的顶点并输出 从AOV网中删去该顶点,并且删去所有以该顶点为尾的弧 重复上述两步,直到全部顶点都被输出, ...
- JAVA笔记12__字节、字符缓冲流/打印流/对象流/
/** * !!:以后写流的时候一定要加入缓冲!! * 对文件或其它目标频繁的读写操作,效率低,性能差. * 缓冲流:好处是能更高效地读写信息,原理是将数据先缓冲起来,然后一起写入或读取出来. * * ...