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}\),一种是输入到这个点,使得两条路径合成 ...
随机推荐
- .net core mvc启动顺序以及主要部件4-MVC
前面三章已经把MVC启动过程以及源代码做了讲解,本章开始正式MVC,mvc全称叫model view controller,也就是把表现层又细分三层,官网的图片描述: 默认创建了一个.net core ...
- 检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配
解决方案: [DllImport("Dll.dll")]改为[DllImport("Dll.dll", CallingConvention=CallingCon ...
- 推荐算法之E&E
一.定义 E&E就是探索(explore)和利用(exploit). Exploit:基于已知最好策略,开发利用已知具有较高回报的item(贪婪.短期回报),对于推荐来讲就是用户已经发现的兴趣 ...
- Docker中上传镜像到docker hub中
原文参考:https://blog.csdn.net/sk_grace/article/details/81220675 申请Docker hub账号首先在https://hub.docker.com ...
- webpack 入门和常用插件的使用
常用配置参数 module.exports = { context: path.resolve(__dirname, '../'), entry: { app: './src/main.js' }, ...
- ajax往后台传值的一些方式
$('#del1').click(function () { $.ajax({ url: 'http://localhost:8089/test1', data: {a: 1, b: 2}, type ...
- Java 之 线程池
一.线程池思想概述 如果使用线程的时候就去创建一个线程,这样实现起来非常简便,但是会出现一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低 ...
- Qt--多线程间的互斥
一.多线程间的互斥 临界资源--每次只允许一个线程进行访问的资源 线程间的互斥--多个线程在同一个时刻需要访问临界资源 QMute类是一把线程锁,保证线程间的互斥--利用线程锁能够保证临界资源的安全性 ...
- Java abstract关键字 抽象类 抽象方法
用 abstract 修饰的类是抽象类,它不能生成对象 含有抽象方法的类称为抽象类 抽象方法使用 abstract 修饰 抽象类不能直接实例化,只能由子类实例化 举例 abstract class T ...
- Django 常用的 Web 应用程序工具
Django 提供了多种开发 Web 应用程序所需的常用工具,如:缓存.日志.发送邮件.自定义认证等,更多可参考:<https://docs.djangoproject.com/zh-hans/ ...