Submission #44916109
Source Code Expand
use proconio::input;
fn add_edge(edges: &mut [Vec<(usize, i64, i64, usize)>], u: usize, v: usize, cap: i64, cost: i64) {
let index_u = edges[u].len();
let index_v = edges[v].len();
edges[u].push((v, cap, cost, index_v));
edges[v].push((u, 0, -cost, index_u));
}
fn bellman_ford(
edges: &[Vec<(usize, i64, i64, usize)>],
s: usize,
) -> (Vec<i64>, Vec<usize>, Vec<usize>) {
let inf = 1_i64 << 60;
let mut dist = vec![inf; edges.len()];
dist[s] = 0;
let mut prev_vert = vec![0_usize; edges.len()];
let mut prev_edge = vec![0_usize; edges.len()];
loop {
let mut update = false;
for v in 0..edges.len() {
if dist[v] == inf {
continue;
}
for (i, (u, cap, cost, _)) in edges[v].iter().copied().enumerate() {
if cap > 0 && dist[u] > dist[v] + cost {
dist[u] = dist[v] + cost;
prev_vert[u] = v;
prev_edge[u] = i;
update = true;
}
}
}
if !update {
break;
}
}
(dist, prev_vert, prev_edge)
}
fn calc_min_cost_flow(
edges: &mut [Vec<(usize, i64, i64, usize)>],
s: usize,
t: usize,
mut capital_f: i64,
) -> i64 {
let inf = 1_i64 << 60;
let mut min_cost = 0_i64;
while capital_f > 0 {
let (dist, prev_vert, prev_edge) = bellman_ford(edges, s);
if dist[t] == inf {
return inf;
}
let mut v = t;
let mut f = capital_f;
while v != s {
let u = prev_vert[v];
let i = prev_edge[v];
let c = edges[u][i].1;
f = f.min(c);
v = u;
}
v = t;
while v != s {
let u = prev_vert[v];
let i = prev_edge[v];
let j = edges[u][i].3;
edges[u][i].1 -= f;
edges[v][j].1 += f;
v = u;
}
min_cost += f * dist[t];
capital_f -= f;
}
min_cost
}
fn main() {
input! {
n: usize,
c: i64,
a: [i64; n],
}
let start = n * 2;
let end = n * 2 + 1;
let offset_i = 0;
let offset_j = n;
let mut edges = vec![vec![]; n * 2 + 2];
for (i, a_i) in a.iter().copied().enumerate() {
add_edge(&mut edges, start, offset_i + i, 1, 0);
for j in i + 1..n {
let a_j = a[j];
add_edge(&mut edges, offset_i + i, offset_j + j, 1, (a_i - a_j).abs());
}
add_edge(&mut edges, offset_i + i, end, 1, c);
}
for j in 0..n {
add_edge(&mut edges, offset_j + j, end, 1, 0);
}
let ans = calc_min_cost_flow(&mut edges, start, end, n as i64);
println!("{}", ans);
}
Submission Info
| Submission Time | |
|---|---|
| Task | M - Divide |
| User | bouzuya |
| Language | Rust (1.42.0) |
| Score | 6 |
| Code Size | 2787 Byte |
| Status | AC |
| Exec Time | 121 ms |
| Memory | 3992 KiB |
Judge Result
| Set Name | Sample | All | ||||
|---|---|---|---|---|---|---|
| Score / Max Score | 0 / 0 | 6 / 6 | ||||
| Status |
|
|
| Set Name | Test Cases |
|---|---|
| Sample | example0.txt, example1.txt, example2.txt |
| All | 000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, 012.txt, 013.txt, 014.txt, 015.txt, 016.txt, 017.txt, 018.txt, 019.txt, 020.txt, 021.txt, 022.txt, 023.txt, 024.txt, 025.txt, 026.txt, 027.txt, 028.txt, 029.txt, 030.txt, 031.txt, 032.txt, 033.txt, 034.txt, 035.txt, 036.txt, 037.txt, 038.txt, 039.txt, 040.txt, 041.txt, 042.txt, 043.txt, 044.txt, 045.txt, 046.txt, 047.txt, 048.txt, 049.txt, 050.txt, 051.txt, 052.txt, 053.txt, 054.txt, 055.txt, 056.txt, 057.txt, 058.txt, 059.txt, 060.txt, 061.txt, 062.txt, 063.txt, 064.txt, 065.txt, 066.txt, example0.txt, example1.txt, example2.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| 000.txt | AC | 6 ms | 1932 KiB |
| 001.txt | AC | 2 ms | 2084 KiB |
| 002.txt | AC | 1 ms | 2144 KiB |
| 003.txt | AC | 2 ms | 2056 KiB |
| 004.txt | AC | 2 ms | 1908 KiB |
| 005.txt | AC | 1 ms | 2176 KiB |
| 006.txt | AC | 2 ms | 2048 KiB |
| 007.txt | AC | 1 ms | 2156 KiB |
| 008.txt | AC | 1 ms | 2072 KiB |
| 009.txt | AC | 3 ms | 2084 KiB |
| 010.txt | AC | 1 ms | 2080 KiB |
| 011.txt | AC | 6 ms | 2316 KiB |
| 012.txt | AC | 8 ms | 2288 KiB |
| 013.txt | AC | 9 ms | 2324 KiB |
| 014.txt | AC | 7 ms | 2368 KiB |
| 015.txt | AC | 11 ms | 2304 KiB |
| 016.txt | AC | 9 ms | 2328 KiB |
| 017.txt | AC | 12 ms | 2340 KiB |
| 018.txt | AC | 16 ms | 2312 KiB |
| 019.txt | AC | 14 ms | 2312 KiB |
| 020.txt | AC | 17 ms | 2404 KiB |
| 021.txt | AC | 10 ms | 2392 KiB |
| 022.txt | AC | 15 ms | 2376 KiB |
| 023.txt | AC | 54 ms | 3992 KiB |
| 024.txt | AC | 51 ms | 3832 KiB |
| 025.txt | AC | 52 ms | 3868 KiB |
| 026.txt | AC | 50 ms | 3740 KiB |
| 027.txt | AC | 106 ms | 3900 KiB |
| 028.txt | AC | 121 ms | 3900 KiB |
| 029.txt | AC | 112 ms | 3816 KiB |
| 030.txt | AC | 114 ms | 3756 KiB |
| 031.txt | AC | 101 ms | 3748 KiB |
| 032.txt | AC | 108 ms | 3860 KiB |
| 033.txt | AC | 98 ms | 3812 KiB |
| 034.txt | AC | 114 ms | 3908 KiB |
| 035.txt | AC | 1 ms | 2072 KiB |
| 036.txt | AC | 1 ms | 2080 KiB |
| 037.txt | AC | 2 ms | 2112 KiB |
| 038.txt | AC | 1 ms | 2028 KiB |
| 039.txt | AC | 2 ms | 2036 KiB |
| 040.txt | AC | 3 ms | 2076 KiB |
| 041.txt | AC | 1 ms | 1980 KiB |
| 042.txt | AC | 1 ms | 2080 KiB |
| 043.txt | AC | 1 ms | 2120 KiB |
| 044.txt | AC | 3 ms | 2136 KiB |
| 045.txt | AC | 1 ms | 2032 KiB |
| 046.txt | AC | 1 ms | 1992 KiB |
| 047.txt | AC | 3 ms | 2084 KiB |
| 048.txt | AC | 2 ms | 2080 KiB |
| 049.txt | AC | 2 ms | 2044 KiB |
| 050.txt | AC | 1 ms | 2056 KiB |
| 051.txt | AC | 1 ms | 2092 KiB |
| 052.txt | AC | 1 ms | 2060 KiB |
| 053.txt | AC | 55 ms | 3948 KiB |
| 054.txt | AC | 44 ms | 3916 KiB |
| 055.txt | AC | 44 ms | 3944 KiB |
| 056.txt | AC | 67 ms | 3876 KiB |
| 057.txt | AC | 66 ms | 3864 KiB |
| 058.txt | AC | 69 ms | 3832 KiB |
| 059.txt | AC | 1 ms | 2044 KiB |
| 060.txt | AC | 1 ms | 2088 KiB |
| 061.txt | AC | 1 ms | 2124 KiB |
| 062.txt | AC | 2 ms | 2052 KiB |
| 063.txt | AC | 38 ms | 3764 KiB |
| 064.txt | AC | 38 ms | 3872 KiB |
| 065.txt | AC | 38 ms | 3876 KiB |
| 066.txt | AC | 38 ms | 3824 KiB |
| example0.txt | AC | 1 ms | 2044 KiB |
| example1.txt | AC | 2 ms | 2056 KiB |
| example2.txt | AC | 2 ms | 1988 KiB |