LOJ3097 SNOI2019 通信 题解
费用流,当建边需要依靠位置和权值两个偏序关系时,可以用cdq分治优化建边。
代码:
#include<bits/stdc++.h>
using namespace std;
#define N 20007
#define M 200007
const int inf=0x3f3f3f3f;
#define ll long long
struct flow
{
int hd[N],pre[M],to[M],num,w[M],mf[N],fa[N],maf,s,t;
ll f[M],dis[N],ans;
bool vis[N];
queue<int> q;
void adde(int x,int y,int z,int l)
{
num++;pre[num]=hd[x];hd[x]=num;to[num]=y;w[num]=z;f[num]=l;
num++;pre[num]=hd[y];hd[y]=num;to[num]=x;w[num]=;f[num]=-l;
}
void Init()
{
num=;
}
bool spfa()
{
memset(dis,0x3f,sizeof(dis));
memset(vis,,sizeof(vis));
while(!q.empty())q.pop();
int i,v,u;
dis[s]=;
mf[s]=inf;
q.push(s);
while(!q.empty())
{
v=q.front();q.pop();
vis[v]=false;
for(i=hd[v];i;i=pre[i])
{
u=to[i];
if(w[i]&&dis[v]+f[i]<dis[u])
{
dis[u]=dis[v]+f[i];
fa[u]=i;
mf[u]=min(mf[v],w[i]);
if(!vis[u])
{
vis[u]=true;
q.push(u);
}
}
}
}
return dis[t]<1e18;
}
void update()
{
int v=t,i,fl=mf[t];
while(v!=s)
{
i=fa[v];
w[i]-=fl;
w[i^]+=fl;
v=to[i^];
}
ans+=dis[t]*fl;
maf+=fl;
}
void main()
{
while(spfa())
update();
}
}D;
struct str
{
int a,p;
}p[N],tmp[N];
bool operator <(str a,str b)
{
return a.p<b.p;
}
int tot,Pre[N],Suf[N],n;
void cdq(int l,int r)
{
if(l==r)return;
int mid=l+r>>,i;
cdq(l,mid),cdq(mid+,r);
for(i=l;i<mid;i++)
{
++tot;
Pre[i]=tot;
D.adde(tot,p[i].p+n,inf,);
D.adde(tot+,tot,inf,p[i+].a-p[i].a);
}
++tot;
Pre[mid]=tot;
D.adde(tot,p[mid].p+n,inf,);
for(i=mid;i>l;i--)
{
++tot;
Suf[i]=tot;
D.adde(tot,p[i].p+n,inf,);
D.adde(tot+,tot,inf,p[i].a-p[i-].a);
}
++tot;
Suf[l]=tot;
D.adde(tot,p[l].p+n,inf,);
int j=l-;
for(i=mid+;i<=r;i++)
{
while(j<mid&&p[j+].a<p[i].a)j++;
if(j>=l)D.adde(p[i].p,Pre[j],inf,p[i].a-p[j].a);
if(j<mid)D.adde(p[i].p,Suf[j+],inf,p[j+].a-p[i].a);
}
i=l,j=mid+;
int k=l;
while(i<=mid&&j<=r)
{
if(p[i].a<p[j].a)
tmp[k++]=p[i++];
else tmp[k++]=p[j++];
}
while(i<=mid)tmp[k++]=p[i++];
while(j<=r)tmp[k++]=p[j++];
for(i=l;i<=r;i++)
p[i]=tmp[i];
}
int main()
{
int i,x,y,w;
scanf("%d%d",&n,&w);
for(i=;i<=n;i++)
{
scanf("%d",&x);
p[i]={x,i};
}
D.Init();
D.s=*n+,D.t=*n+;
tot=*n+;
for(i=;i<=n;i++)
{
D.adde(D.s,i,,);
D.adde(i,D.t,,w);
D.adde(i+n,D.t,,);
}
sort(p+,p+n+);
cdq(,n);
D.main();
printf("%lld\n",D.ans);
return ;
}
LOJ3097 SNOI2019 通信 题解的更多相关文章
- 【LOJ#3097】[SNOI2019]通信(费用流)
[LOJ#3097][SNOI2019]通信(费用流) 题面 LOJ 题解 暴力就直接连\(O(n^2)\)条边. 然后分治/主席树优化连边就行了. 抄zsy代码,zsy代码是真的短 #include ...
- 题解 洛谷 P5331 【[SNOI2019]通信】
考虑用费用流解决本题. 每个哨站看作一个点,并将其拆为两个点,建图方式为: \(S \longrightarrow x_i\) 容量为\(1\),费用为\(0\) \(x_i \longrightar ...
- 【洛谷P5331】 [SNOI2019]通信
洛谷 题意: \(n\)个哨站排成一列,第\(i\)个哨站的频段为\(a_i\). 现在每个哨站可以选择: 直接连接到中心,代价为\(w\): 连接到前面某个哨站\(j(j<i)\),代价为\( ...
- luogu P5331 [SNOI2019]通信
传送门 有匹配次数限制,求最小代价,这显然是个费用流的模型.每个点暴力和前面的点连匹配边,边数是\(n^2\)的. 然后发现可以转化成一个set,每次加入一个点,然后入点对set里面的出点连边.这个s ...
- LOJ#3097 [SNOI2019]通信 最小费用最大流+cdq分治/主席树/分块优化建图
瞎扯 我们网络流模拟赛(其实是数据结构模拟赛)的T2. 考场上写主席树写自闭了,直接交了\(80pts\)的暴力,考完出来突然发现: woc这个题一个cdq几行就搞定了! 题意简述 有\(n\)个哨站 ...
- P5331 [SNOI2019]通信 [线段树优化建图+最小费用最大流]
这题真让人自闭-我EK费用流已经死了?- (去掉define int long long就过了) 我建的边害死我的 spfa 还是spfa已经死了? 按费用流的套路来 首先呢 把点 \(i\) 拆成两 ...
- [SNOI2019] 通信
一.题目 点此看题 二.解法 一看就是傻逼补流模型,不会真的有人这个图都建不出来吧 别走啊,我不阴阳怪气了,如果你不知道怎么建这里有图嘛(思路来源是餐巾计划问题): 其中标红的边数量级很大,因为 \( ...
- 洛谷 P5331 - [SNOI2019]通信(CDQ 分治优化建图+费用流)
题面传送门 首先熟悉网络流的同学应该能一眼看出此题的建模方法: 将每个点拆成两个点 \(in_i,out_i\),连一条 \(S\to in_i\),容量为 \(1\) 费用为 \(0\) 的边 连一 ...
- 【LOJ】#3097. 「SNOI2019」通信
LOJ#3097. 「SNOI2019」通信 费用流,有点玄妙 显然按照最小路径覆盖那题的建图思路,把一个点拆成两种点,一种是从这个点出去,标成\(x_{i}\),一种是输入到这个点,使得两条路径合成 ...
随机推荐
- RabbitMQ学习之Routing(4)
上一节,是广播日志message到很多的receivers. 这节,我们讲订阅其中的一个子集.例如,我们想可以把危机的error message导到log file.而仍然可以打印所有的log mes ...
- wps金山文档在线编辑--.Net 接入指南
一.申请成为服务商,对金山文档在线服务进行申请 ①进入官网 https://open.wps.cn/ ②申请后如下图,点击右下角的进入服务 ③申请成功后 ④数据回调URL一定是服务器地址,本次我使用的 ...
- java面试经常涉及到的
需要掌握的Java知识点: 1 基本数据类型.循环控制.String类型的使用.数组.类和对象.接口和抽象类.面向对象三大特征.异常处理.集合类(List.Map.Set) 2 能够熟练使用Sprin ...
- 图像上划矩形(cv.line()函数)
在图像上划矩形 import numpy as npimport cv2 as cvimg=np.zeros((400,400),np.uint8)cv.line(img,(100,100),(350 ...
- 为什么要用 redis 而不用 map 做缓存?
缓存分为本地缓存和分布式缓存.以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例 ...
- python基础03day
# 1. # 创建字符串变量的三种写法及其区别 # 代码: #‘’.“”.“““””” # 区别: # 2. # 简述,计算机编程语言的分类及特点 # 1.机器 # 2.汇编 # 3.高级 # 3.1 ...
- NodeJS新建服务器以及CommonJS规范
1.什么是node.js?(1)Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.( ...
- 第一册:lesson 133.
原文: Sensational news. question:What reasons did Karen give for a wanting to retire? Have you just m ...
- js修改页面标题 title
如果对你有帮助的话麻烦点个[推荐]~最好还可以follow一下我的GitHub~感谢观看! /* * *添加首页description元数据meta标签 *创建一个meta元素,sName为该meta ...
- Locust性能测试7-分布式执行
前言 使用Locust进行性能测试时,当一台单机不足以模拟所需的用户数量的时候,可以在多台机器上分布式的执行性能测试. locust分布式启动场景有2种,一种是单机设置master和slave模式,另 ...