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}\),一种是输入到这个点,使得两条路径合成 ...
随机推荐
- How to signout from an Azure Application?(转载)
问: I have created a Azure AD application and a Web App. The Azure AD Application uses AAD Authentica ...
- dubbo循序渐进 - Jenkins自动化部署
最新版安装docker pull jenkinsci/jenkins sudo chown -R 1000:1000 ~/jenkins docker run -d -p : -m 1024m -v ...
- spark源码阅读--shuffle读过程源码分析
shuffle读过程源码分析 上一篇中,我们分析了shuffle在map阶段的写过程.简单回顾一下,主要是将ShuffleMapTask计算的结果数据在内存中按照分区和key进行排序,过程中由于内存限 ...
- Spring MVC异常友好展示
官网 https://docs.spring.io/spring/docs/4.3.25.RELEASE/spring-framework-reference/htmlsingle/ Springmv ...
- SQL语句及数据库优化
1,统一SQL语句的写法 对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的. 所以封装成复用方法,用标准模板来控制. select*from dual select*Fro ...
- Cheat Engine 基本用法
打开游戏 当前血量2620 打开Cheat Engine 扫描2620 掉点血 再次扫描2600 此时,会根据第一次扫描结果,再次扫描 扫描成功 将数据放到修改区,点击箭头 修改数据 双击Value进 ...
- css animation动画使用
<!-- animation 属性是一个简写属性,用于设置六个动画属性: animation-name animation-duration animation-timing-function ...
- prometheus学习系列五: Prometheus配置文件
在prometheus监控系统,prometheus的职责是采集,查询和存储和推送报警到alertmanager.本文主要介绍下prometheus的配置文件. 全局配置文件简介 默认配置文件 [ro ...
- Httpd服务进阶知识-基于Apache Modele的LAMP架构之WordPress案例
Httpd服务进阶知识-基于Apache Modele的LAMP架构之WordPress案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装依赖包及数据库授权 博主推荐阅读 ...
- VMware虚拟化kvm安装部署总结
虚拟化 1.环境 Centos7.3 关闭selinux,关闭防火墙 2.虚拟化环境配置 2.1 kvm部署安装 1. VMware 配置桥接模式 2.bios开启虚拟机,以本地台式机为例, 重启动电 ...