Submission #44826299
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,
m: i64,
a: [i64; n],
b: [i64; n],
r: [i64; 3],
}
let count_v = 3 * (n + 1) + n + 2;
let rounds = vec![0, n, 2 * n];
let penalty = rounds[2] + n;
let starts = vec![penalty + n, penalty + n + 1, penalty + n + 2];
let start = starts[2] + 1;
let end = start + 1;
let mut edges = vec![vec![]; count_v];
for i in 0..3 {
add_edge(&mut edges, start, starts[i], m, 0);
}
for i in 0..3 {
for j in 0..n {
let p_j = a[j] * (b[j].pow((i + 1) as u32)) % r[i];
add_edge(&mut edges, starts[i], rounds[i] + j, 1, -p_j);
add_edge(&mut edges, rounds[i] + j, penalty + j, 1, 0);
}
}
for j in 0..n {
let q_0 = a[j] * b[j];
let q_1 = a[j] * b[j].pow(2) - q_0;
let q_2 = a[j] * b[j].pow(3) - q_0 - q_1;
add_edge(&mut edges, penalty + j, end, 1, q_0);
add_edge(&mut edges, penalty + j, end, 1, q_1);
add_edge(&mut edges, penalty + j, end, 1, q_2);
}
let ans = -calc_min_cost_flow(&mut edges, start, end, m * 3);
println!("{}", ans);
}
Submission Info
| Submission Time |
|
| Task |
O - Quoits |
| User |
bouzuya |
| Language |
Rust (1.42.0) |
| Score |
6 |
| Code Size |
3227 Byte |
| Status |
AC |
| Exec Time |
105 ms |
| Memory |
2604 KiB |
Judge Result
| Set Name |
Sample |
All |
| Score / Max Score |
0 / 0 |
6 / 6 |
| Status |
|
|
| Set Name |
Test Cases |
| Sample |
sample0.txt, sample1.txt, sample2.txt |
| All |
hand0.txt, hand1.txt, hand2.txt, large1.txt, large10.txt, large11.txt, large12.txt, large17.txt, large18.txt, large19.txt, large2.txt, large20.txt, large3.txt, large4.txt, large5.txt, large6.txt, large7.txt, large8.txt, large9.txt, large_13.txt, large_14.txt, large_15.txt, large_16.txt, same1.txt, same2.txt, same3.txt, sample0.txt, sample1.txt, sample2.txt, small0.txt, small1.txt, small2.txt, small3.txt, small4.txt, small5.txt, small6.txt, small7.txt, small8.txt, small9.txt |
| Case Name |
Status |
Exec Time |
Memory |
| hand0.txt |
AC |
5 ms |
2136 KiB |
| hand1.txt |
AC |
1 ms |
2164 KiB |
| hand2.txt |
AC |
1 ms |
2112 KiB |
| large1.txt |
AC |
2 ms |
2580 KiB |
| large10.txt |
AC |
88 ms |
2556 KiB |
| large11.txt |
AC |
86 ms |
2432 KiB |
| large12.txt |
AC |
37 ms |
2480 KiB |
| large17.txt |
AC |
30 ms |
2512 KiB |
| large18.txt |
AC |
84 ms |
2604 KiB |
| large19.txt |
AC |
56 ms |
2560 KiB |
| large2.txt |
AC |
3 ms |
2548 KiB |
| large20.txt |
AC |
75 ms |
2536 KiB |
| large3.txt |
AC |
72 ms |
2528 KiB |
| large4.txt |
AC |
81 ms |
2556 KiB |
| large5.txt |
AC |
100 ms |
2528 KiB |
| large6.txt |
AC |
14 ms |
2532 KiB |
| large7.txt |
AC |
97 ms |
2472 KiB |
| large8.txt |
AC |
96 ms |
2548 KiB |
| large9.txt |
AC |
105 ms |
2512 KiB |
| large_13.txt |
AC |
66 ms |
2416 KiB |
| large_14.txt |
AC |
74 ms |
2484 KiB |
| large_15.txt |
AC |
77 ms |
2572 KiB |
| large_16.txt |
AC |
78 ms |
2436 KiB |
| same1.txt |
AC |
45 ms |
2476 KiB |
| same2.txt |
AC |
47 ms |
2508 KiB |
| same3.txt |
AC |
1 ms |
2092 KiB |
| sample0.txt |
AC |
1 ms |
2060 KiB |
| sample1.txt |
AC |
1 ms |
1952 KiB |
| sample2.txt |
AC |
1 ms |
2184 KiB |
| small0.txt |
AC |
90 ms |
2496 KiB |
| small1.txt |
AC |
1 ms |
2072 KiB |
| small2.txt |
AC |
1 ms |
2044 KiB |
| small3.txt |
AC |
2 ms |
2096 KiB |
| small4.txt |
AC |
2 ms |
2108 KiB |
| small5.txt |
AC |
2 ms |
2060 KiB |
| small6.txt |
AC |
2 ms |
2024 KiB |
| small7.txt |
AC |
1 ms |
2060 KiB |
| small8.txt |
AC |
1 ms |
1980 KiB |
| small9.txt |
AC |
2 ms |
2176 KiB |