题目链接

费用流,当建边需要依靠位置和权值两个偏序关系时,可以用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 通信 题解的更多相关文章

  1. 【LOJ#3097】[SNOI2019]通信(费用流)

    [LOJ#3097][SNOI2019]通信(费用流) 题面 LOJ 题解 暴力就直接连\(O(n^2)\)条边. 然后分治/主席树优化连边就行了. 抄zsy代码,zsy代码是真的短 #include ...

  2. 题解 洛谷 P5331 【[SNOI2019]通信】

    考虑用费用流解决本题. 每个哨站看作一个点,并将其拆为两个点,建图方式为: \(S \longrightarrow x_i\) 容量为\(1\),费用为\(0\) \(x_i \longrightar ...

  3. 【洛谷P5331】 [SNOI2019]通信

    洛谷 题意: \(n\)个哨站排成一列,第\(i\)个哨站的频段为\(a_i\). 现在每个哨站可以选择: 直接连接到中心,代价为\(w\): 连接到前面某个哨站\(j(j<i)\),代价为\( ...

  4. luogu P5331 [SNOI2019]通信

    传送门 有匹配次数限制,求最小代价,这显然是个费用流的模型.每个点暴力和前面的点连匹配边,边数是\(n^2\)的. 然后发现可以转化成一个set,每次加入一个点,然后入点对set里面的出点连边.这个s ...

  5. LOJ#3097 [SNOI2019]通信 最小费用最大流+cdq分治/主席树/分块优化建图

    瞎扯 我们网络流模拟赛(其实是数据结构模拟赛)的T2. 考场上写主席树写自闭了,直接交了\(80pts\)的暴力,考完出来突然发现: woc这个题一个cdq几行就搞定了! 题意简述 有\(n\)个哨站 ...

  6. P5331 [SNOI2019]通信 [线段树优化建图+最小费用最大流]

    这题真让人自闭-我EK费用流已经死了?- (去掉define int long long就过了) 我建的边害死我的 spfa 还是spfa已经死了? 按费用流的套路来 首先呢 把点 \(i\) 拆成两 ...

  7. [SNOI2019] 通信

    一.题目 点此看题 二.解法 一看就是傻逼补流模型,不会真的有人这个图都建不出来吧 别走啊,我不阴阳怪气了,如果你不知道怎么建这里有图嘛(思路来源是餐巾计划问题): 其中标红的边数量级很大,因为 \( ...

  8. 洛谷 P5331 - [SNOI2019]通信(CDQ 分治优化建图+费用流)

    题面传送门 首先熟悉网络流的同学应该能一眼看出此题的建模方法: 将每个点拆成两个点 \(in_i,out_i\),连一条 \(S\to in_i\),容量为 \(1\) 费用为 \(0\) 的边 连一 ...

  9. 【LOJ】#3097. 「SNOI2019」通信

    LOJ#3097. 「SNOI2019」通信 费用流,有点玄妙 显然按照最小路径覆盖那题的建图思路,把一个点拆成两种点,一种是从这个点出去,标成\(x_{i}\),一种是输入到这个点,使得两条路径合成 ...

随机推荐

  1. CorelDRAW 学习笔记(一)

    基本图形 等比例图形:按住 Ctrl 拖拽 以中心为起点等比例缩放:按住 Shift 拖拽 快捷键: 矩形:F6 圆形:F7 多边形:Y 双击矩形工具,可以直接创建一个页面大小的矩形对象: 对象对齐 ...

  2. c#读取数据库bool值

    数据库里bit这个布尔类型的字段,非常实用,但是在c#里读取时,许多人喜欢犯一些错误,导致运行报错. 实际中,有效的正确读取方法只有以下两种: int xxx= Convet.ToInt16(read ...

  3. Java Mockito 笔记

    Mockito 1 Overview 2 Maven 项目初始化 3 示例 3.1 第一个示例 3.2 自动 Mock 3.3 Mock 返回值 3.4 Mock 参数 3.5 自动注入 Mock 对 ...

  4. Ubuntu系统下搭建docke

    linux内核版本依赖 kernel version >= 3.8 可以使用如下命令查看 uname -a | awk '{split($3, arr, "-"); prin ...

  5. Linux下mongoDB下载与安装

    原文连接:(http://www.studyshare.cn/blog/details/1168/0)一.下载 官网下载:点击下载 选择合适的版本 百度网盘下载:点击下载  提取码:rm12 此处提供 ...

  6. English--名词从句

    English|名词从句 现在开始讲述关于名词从句的内容.从句大家都不陌生,但是学习了那么多年,什么是从句?接下来让我们一起来看看. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知 ...

  7. 【转载】C#的DataTable使用NewRow方法创建新表格行

    在C#的DataTable数据表格操作过程中,DataRow类表示DataTable中的数据行信息,但DataRow没有可以直接实例化的构造方法,在创建DataTable的新行的时候,不可直接使用Da ...

  8. 前端用js获取本地文件的内容

    这里要写成input的形式 调用upload函数 传递的参数就表示所选的文件<input type="file" onchange="upload(this)&qu ...

  9. ip协议栈

    struct iphdr { #if defined(__LITTLE_ENDIAN_BITFIELD) __u8 ihl:4, version:4; #elif defined (__BIG_END ...

  10. Redis特点分析及性能优化

    一.Key >Redis key值是二进制安全的,这意味着可以可以使用任何二进制序列作为key值.空字符串也是有效的key值. >key取值原则 1.键值不需要太长,消耗内存,且在数据中查 ...