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}\),一种是输入到这个点,使得两条路径合成 ...
随机推荐
- oracle 根据字段分组取第一条数据及rank函数说明
当前有这样一个需求,根据外键对子表数据进行分组,取每组中的一条数据就行了,如图: 如:COMMANDID = 26的有两条,只取一条数据. sql语句: select * from(select SY ...
- .net list转树状结构
主要的方法 /// <summary> /// 转化成树结构 /// </summary> /// <param name="menuList"> ...
- Phenix.NET for CSLA & WF4,企业级、分布式、符合领域建模的OOP软件快速开发平台
2014-5-20版本: Phenix.NET for CSLA & WF 开发平台: http://download.csdn.net/download/phenixiii/7390405 ...
- ELK部署配置使用记录
为什么要用ELK: 一般我们需要进行日志分析场景:直接在日志文件中 grep.awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档.文本搜索太慢怎么办 ...
- Linux下搭建keepalive+nginx
一. 安装nginx(略) 二. 安装keepalive 下载http://www.keepalived.org/download.html 安装依赖包 yum install –y popt* gc ...
- Django--模型层进阶
目录 QuerySet对象 可切片 可迭代 惰性查询 缓存机制 何时查询集不会被缓存? exists()与iterator()方法 exists() iterator() 中介模型 查询优化 表数据 ...
- 原生aJax跨域
今天遇到一个问题,利用原生ajax请求时报了一段错, 大概意思就是同源策略阻止了访问,也就是跨域, 后来发现是我在代码中发送了请求头, xhr.setRequestHeader(); 将这段代码删除后 ...
- Socket-网络服务提供的一种机制
网络编程 网络通信的要素 Ip,端口,协议(tcp/udp) 127.0.0.1 本机地址 默认主机名:localhost 端口号:用于标识进程的逻辑地址. 有效端口:0-65535 其中 ...
- android黑白屏的问题
你会很奇怪,为什么有些app启动时,会出现一会儿的黑屏或者白屏才进入Activity的界面显示,但是有些app却不会如QQ手机端,的确这里要做处理一下.这里先了解一下为什么会出现这样的现象,其实很简单 ...
- byte[],File和InputStream的相互转换
File.FileInputStream 转换为byte[] File file = new File("test.txt"); InputStream input = new F ...