LOJ#3097. 「SNOI2019」通信

费用流,有点玄妙

显然按照最小路径覆盖那题的建图思路,把一个点拆成两种点,一种是从这个点出去,标成\(x_{i}\),一种是输入到这个点,使得两条路径合成一条(或者是新建一条),标成\(y_i\)

源点向每个\(x_i\)流一条容量为1,费用为0的边

然后向每个\(y_{i}\)流一条容量为1,费用为W的边

每个\(y_i\)向汇点连一条容量为1,费用为0的边

这个时候,如果你充满梦想,你可以把所有的\(x_{i}\)到\(y_j\)(\(i < j\))连一条\(|a_{i} - a_{j}|\)的边

然而你没有梦想,你觉得似乎不太优秀

然后你可以分治,把每一层的点分成左右两部分,然后把左边点权值离散化后建出一个前缀最大值节点,串成一条链,并在对应的位置连上左边的\(a_{i}\)

另一种情况把右边的权值离散化(或者按相同的方式给左边连负数也行),建出前缀最大值节点,串成一条链,在对应位置连上右边的\(a_{i}\)

这样边数就被优化成\(n\log n\)了

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int, int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define ba 47
#define MAXN 1005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template <class T>
void read(T &res) {
res = 0;
T f = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template <class T>
void out(T x) {
if (x < 0) {
x = -x;
putchar('-');
}
if (x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
struct node {
int to, next, cap;
int64 val;
} E[3000005];
int head[2000005], sumE = 1;
int x[1005], y[1005], N, a[1005], W, S, T, Ncnt = 0;
void add(int u, int v, int c, int64 a) {
E[++sumE].to = v;
E[sumE].next = head[u];
E[sumE].cap = c;
E[sumE].val = a;
head[u] = sumE;
}
void addtwo(int u, int v, int c, int64 a) {
add(u, v, c, a);
add(v, u, 0, -a);
}
int val[1005], tot, pos[1005];
void build(int l, int r) {
if (l == r)
return;
if (r - l + 1 == 2) {
addtwo(x[l], y[r], 1, abs(a[l] - a[r]));
return;
}
int mid = (l + r) >> 1;
build(l, mid);
build(mid + 1, r);
tot = 0;
for (int i = l; i <= mid; ++i) {
val[++tot] = a[i];
}
sort(val + 1, val + tot + 1);
tot = unique(val + 1, val + tot + 1) - val - 1;
for (int i = tot; i >= 1; --i) {
pos[i] = ++Ncnt;
if (i != tot)
addtwo(pos[i + 1], pos[i], 1e9, 0);
}
for (int i = l; i <= mid; ++i) {
int t = lower_bound(val + 1, val + tot + 1, a[i]) - val;
addtwo(x[i], pos[t], 1, a[i]);
}
for (int i = mid + 1; i <= r; ++i) {
int t = lower_bound(val + 1, val + tot + 1, a[i]) - val;
if (t <= tot)
addtwo(pos[t], y[i], 1, -a[i]);
}
tot = 0;
for (int i = mid + 1; i <= r; ++i) val[++tot] = a[i];
sort(val + 1, val + tot + 1);
tot = unique(val + 1, val + tot + 1) - val - 1;
for (int i = 1; i <= tot; ++i) {
pos[i] = ++Ncnt;
if (i != 1)
addtwo(pos[i - 1], pos[i], 1e9, 0);
}
for (int i = mid + 1; i <= r; ++i) {
int t = lower_bound(val + 1, val + tot + 1, a[i]) - val;
addtwo(pos[t], y[i], 1, a[i]);
}
for (int i = l; i <= mid; ++i) {
int t = lower_bound(val + 1, val + tot + 1, a[i]) - val;
if (t <= tot)
addtwo(x[i], pos[t], 1, -a[i]);
}
}
int64 dis[100005];
int preE[100005];
bool inq[100005];
queue<int> Q;
bool SPFA() {
for (int i = 1; i <= Ncnt; ++i) dis[i] = 1e18;
memset(inq, 0, sizeof(inq));
inq[S] = 1;
dis[S] = 0;
Q.push(S);
while (!Q.empty()) {
int u = Q.front();
Q.pop();
inq[u] = 0;
for (int i = head[u]; i; i = E[i].next) {
if (E[i].cap > 0) {
int v = E[i].to;
if (dis[v] > dis[u] + E[i].val) {
dis[v] = dis[u] + E[i].val;
preE[v] = i;
if (!inq[v]) {
inq[v] = 1;
Q.push(v);
}
}
}
}
}
return dis[T] != 1e18;
}
void Init() {
read(N);
read(W);
S = 2 * N + 1, T = 2 * N + 2;
for (int i = 1; i <= N; ++i) {
read(a[i]);
x[i] = ++Ncnt;
y[i] = ++Ncnt;
addtwo(S, x[i], 1, 0);
addtwo(S, y[i], 1, W);
addtwo(y[i], T, 1, 0);
}
Ncnt += 2;
build(1, N);
}
void Solve() {
Init();
int64 ans = 0;
while (SPFA()) {
ans += dis[T];
int p = T;
while (p != S) {
int t = preE[p];
E[t].cap -= 1;
E[t ^ 1].cap += 1;
p = E[t ^ 1].to;
}
}
out(ans);
enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in", "r", stdin);
#endif
Solve();
}

【LOJ】#3097. 「SNOI2019」通信的更多相关文章

  1. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  2. 「SNOI2019」通信

    题目 还好我没生在陕西啊 首先发现这个题不能\(dp\),数据范围不大,好像一种网络流的样子啊 哎等等,这样向后面连边不是一个\(DAG\)吗,这不是最小权路径覆盖的板子吗 于是我们套路的拆点,对于一 ...

  3. 「SNOI2019」通信 分治优化费用流建图

    题意: n 个排成一列的哨站要进行通信.第 i 个哨站的频段为 ai. 每个哨站 ii 需要选择以下二者之一: 1.直接连接到控制中心,代价为 W:2.连接到前面的某个哨站 j(j<i),代价为 ...

  4. 「SNOI2019」通信 分治建图

    根据题意 每个点可以直接与S,T相连 也可以和前面的哨站相连 暴力建边的话 有n2条边 要用分治优化建边: 类似于归并排序 先对每一层分为左半边与右半边 对每一半都拿出来先排序去重后 直接排成一条链建 ...

  5. 【LOJ】#3098. 「SNOI2019」纸牌

    LOJ#3098. 「SNOI2019」纸牌 显然选三个以上的连续牌可以把他们拆分成三个三张相等的 于是可以压\((j,k)\)为有\(j\)个连续两个的,有\(k\)个连续一个的 如果当前有\(i\ ...

  6. 【LOJ】#3096. 「SNOI2019」数论

    LOJ#3096. 「SNOI2019」数论 如果\(P > Q\)我们把\(P\)和\(Q\)换一下,现在默认\(P < Q\) 这个时候每个合法的\(a_i\)都可以直接落到\(Q\) ...

  7. 【LOJ】#3095. 「SNOI2019」字符串

    LOJ#3095. 「SNOI2019」字符串 如果两个串\(i,j\)比较\(i < j\),如果离\(a_{i}\)最近的不同的数是\(a_{k}\),如果\(j < k\)那么\(i ...

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

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

  9. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

随机推荐

  1. Gym - 102307G Graduation 拓扑排序

    Gym - 102307G Graduation  题意:xjl得修够n门课才能毕业,其中有些课是某门课的先行课,并且他精力有限,每学期最多只能修k门课,问xjl最少需要多少学期才能毕业. 首先,正向 ...

  2. cyk追楠神系列一(SDUT3703)

    cyk追楠神系列一 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 众所周知,cyk ...

  3. 集合家族——stack

    一.概述 在 Java 中 Stack 类表示后进先出(LIFO)的对象堆栈.栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的 它通过五个操作对类 Vector 进行了扩展 ,允许将向 ...

  4. redis之redis-cluster配置

    为什么要用redis-cluster 并发问题 redis官方生成可以达到 10万/每秒,每秒执行10万条命令 假如业务需要每秒100万的命令执行呢? 数据量太大 一台服务器内存正常是16~256G, ...

  5. Hdu5762

    Hdu5762 题意: 你n个点,让你找两个数对,A,B和C,D,使得A和B的曼哈顿距离等于C和D的曼哈顿距离,问是否存在这样的对,A!=C且B!=D. 解法: 直接暴力判断,时间复杂度是 $ O(n ...

  6. Ubuntu14.04-OpenCV2和3共存相关设置

    文章转自:http://blog.csdn.net/a356337092/article/details/73529635 安装依赖项: sudo apt-get install build-esse ...

  7. Jenkins 插件加速下载

    本文主旨 看到好多加速Jenkins安装插件速度的文章,大多数教程中都是在插件配置里使用 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/up ...

  8. mysql 优化知识点

    附录: https://www.nowcoder.com/discuss/150059?type=0&order=0&pos=13&page=0 本文概要 概述 为什么要优化 ...

  9. Airbnb架构要点分享——阅读心得

    目前,Airbnb已经使用了大约5000个AWS EC2实例,其中大约1500个实例用于部署其应用程序中面向Web的部分,其余的3500个实例用于各种分析和机器学习算法.而且,随着Airbnb的发展, ...

  10. 高性能高可用的微服务框架TarsGo的腾讯实践

    conference/2.3 高性能高可用的微服务框架TarsGo的腾讯实践 - 陈明杰.pdf at master · gopherchina/conferencehttps://github.co ...