From 714fcc3e5448c3fd730a8faf88730a279f1c4654 Mon Sep 17 00:00:00 2001 From: Bruno Freitas Tissei <bft15@inf.ufpr.br> Date: Mon, 19 Aug 2019 18:31:23 -0300 Subject: [PATCH] Add Heavy Light Decomposition Signed-off-by: Bruno Freitas Tissei <bft15@inf.ufpr.br> --- algorithms/geometry/rotating_calipers.cpp | 41 +++ algorithms/graph/hld.cpp | 141 ++++++++ algorithms/graph/lca.cpp | 21 +- algorithms/structure/lazy_segment_tree.cpp | 12 +- algorithms/structure/segment_tree.cpp | 66 +++- contests/Cadernaveis/LA5138.cpp | 95 ++++++ contests/Cadernaveis/a.out | Bin 0 -> 51416 bytes contests/Cadernaveis/in | 10 + contests/Cadernaveis/out | 369 +++++++++++++++++++++ 9 files changed, 723 insertions(+), 32 deletions(-) create mode 100644 algorithms/geometry/rotating_calipers.cpp create mode 100644 algorithms/graph/hld.cpp create mode 100644 contests/Cadernaveis/LA5138.cpp create mode 100755 contests/Cadernaveis/a.out create mode 100644 contests/Cadernaveis/in create mode 100644 contests/Cadernaveis/out diff --git a/algorithms/geometry/rotating_calipers.cpp b/algorithms/geometry/rotating_calipers.cpp new file mode 100644 index 0000000..65fd15e --- /dev/null +++ b/algorithms/geometry/rotating_calipers.cpp @@ -0,0 +1,41 @@ +/// Rotating Calipers +/// +/// Time: O(n log n) +/// Space: O(n) + +double dist(point a, point b) { + return hypot(a.fi - b.fi, a.se - b.se); +} + +double area(point a, point b, point c) { + return abs((b.fi - a.fi) * (c.se - a.se) - \ + (b.se - a.se) * (c.fi - a.fi)); +} + +double diameter(vector<point> &v) { + vector<point> h = convex_hull(v); + + int m = h.size(); + if (m == 1) return 0; + if (m == 2) return dist(h[0], h[1]); + + int k = 1; + while (area(h[m-1], h[0], h[(k+1)%m]) > + area(h[m-1], h[0], h[k])) + k++; + + double ans = 0; + for (int i = 0, j = k; i <= k && j < m; ++i) { + ans = max(ans, dist(h[i], h[j])); + + while (i < m && + area(h[i], h[(i+1)%m], h[(j+1)%m]) > + area(h[i], h[(i+1)%m], h[j])) + { + ans = max(ans, dist(h[i], h[(j+1)%m])); + j++; + } + } + + return ans; +} diff --git a/algorithms/graph/hld.cpp b/algorithms/graph/hld.cpp new file mode 100644 index 0000000..777dc7b --- /dev/null +++ b/algorithms/graph/hld.cpp @@ -0,0 +1,141 @@ +/// Heavy Light Decomposition +/// +/// Time: +/// - build: O(n log n) +/// - query: O(log^2 n) +/// - update: O(log n) +/// Space: O(n log n) + +#define LOG 20 // log2(MAX) + +ii edge[MAX]; +int par[MAX][LOG]; +vector<ii> graph[MAX]; + +template <typename ST> +struct HLD { + ST &seg; + int cnum, ptr; + + // Size of subtree, and depth + vector<int> size, dep; + + // Chain's head, chain's index, base array for segtree, + // position of node in base, and bottommost node + vector<int> chead, cidx, base, pos, bot; + + HLD(int n, ST &seg) : + seg(seg), size(n), dep(n, 0), bot(n), + chead(n, -1), cidx(n), base(n), pos(n) + { + mset(par, -1); + cnum = ptr = 0; + + dfs(0); + decompose(0); + + N = ptr; // global N for segtree + seg.build(base); + + // bot[i] stores the bottommost (depth-wise) node + // on the i-th edge + for (int i = 0; i < N - 1; ++i) + if (dep[edge[i].fi] > dep[edge[i].se]) + bot[i] = edge[i].fi; + else + bot[i] = edge[i].se; + } + + void dfs(int x, int p = -1) { + size[x] = 1; + par[x][0] = p; + + for (int i = 1; i < LOG; ++i) + if (par[x][i - 1] != -1) + par[x][i] = par[par[x][i - 1]][i - 1]; + + for (auto i : graph[x]) + if (i.fi != p) { + dep[i.fi] = dep[x] + 1; + dfs(i.fi, x); + size[x] += size[i.fi]; + } + } + + void decompose(int x, int c = -1, int p = -1) { + if (chead[cnum] == -1) + chead[cnum] = x; + + pos[x] = ptr; + cidx[x] = cnum; + base[ptr++] = c; + + ii sc(-1, -1); + if (graph[x].size() > 1) { + for (auto i : graph[x]) + if (i.fi != p) + if (sc.fi == -1 || size[sc.fi] < size[i.fi]) + sc = i; + + decompose(sc.fi, sc.se, x); + } + + for (auto i : graph[x]) + if (sc.fi != i.fi && i.fi != p) { + cnum++; + decompose(i.fi, i.se, x); + } + } + + int query_up(int a, int b) { + if (a == b) return 0; + + int ca, cb = cidx[b], ans = -1; + while (1) { + ca = cidx[a]; + if (ca == cb) { + if (a == b) break; + ans = max(ans, seg.query(pos[b] + 1, pos[a])); + break; + } + + ans = max(ans, seg.query(pos[chead[ca]], pos[a])); + a = par[chead[ca]][0]; + } + + return ans; + } + + int lca(int a, int b) { + int ans = 0; + + if (dep[a] < dep[b]) + swap(a, b); + + for (int i = LOG - 1; i >= 0; --i) + if (par[a][i] != -1 && dep[par[a][i]] >= dep[b]) + a = par[a][i]; + + if (a == b) + return a; + + for (int i = LOG - 1; i >= 0; --i) + if (par[a][i] != -1 && par[a][i] != par[b][i]) { + a = par[a][i]; + b = par[b][i]; + } + + return par[a][0]; + } + + // Queries max edge on the path between a and b + int query(int a, int b) { + int lab = lca(a, b); + return max(query_up(a, lab), query_up(b, lab)); + } + + // Updates value of i-th edge + void update(int i, int val) { + seg.update(pos[bot[i]], val); + } +}; diff --git a/algorithms/graph/lca.cpp b/algorithms/graph/lca.cpp index a0efdf7..51bd1cf 100644 --- a/algorithms/graph/lca.cpp +++ b/algorithms/graph/lca.cpp @@ -17,24 +17,21 @@ /// - query: O(log V) /// Space: O(V + E + V log V) -#define MAXLOG 20 //log2(MAX) +#define LOG 20 // log2(MAX) vector<ii> graph[MAX]; +int par[MAX][LOG], cost[MAX][LOG]; struct LCA { vector<int> h; - vector<vector<int>> par, cost; - LCA(int N) : - h(N), - par(N, vector<int>(MAXLOG)), - cost(N, vector<int>(MAXLOG)) + LCA(int N) : h(N) { init(); } void init() { - for (auto &i : par) fill(all(i), -1); - for (auto &i : cost) fill(all(i), 0); - dfs(0); // 0-indexed vertices + mset(par, -1); + mset(cost, 0); + dfs(0); // root is 0 } int op(int a, int b) { @@ -48,7 +45,7 @@ struct LCA { if (p != -1) h[v] = h[p] + 1; - for (int i = 1; i < MAXLOG; ++i) + for (int i = 1; i < LOG; ++i) if (par[v][i - 1] != -1) { par[v][i] = par[par[v][i - 1]][i - 1]; cost[v][i] = op(cost[v][i], op(cost[v][i-1], @@ -66,7 +63,7 @@ struct LCA { if (h[a] < h[b]) swap(a, b); - for (int i = MAXLOG - 1; i >= 0; --i) + for (int i = LOG - 1; i >= 0; --i) if (par[a][i] != -1 && h[par[a][i]] >= h[b]) { ans = op(ans, cost[a][i]); a = par[a][i]; @@ -80,7 +77,7 @@ struct LCA { #endif } - for (int i = MAXLOG - 1; i >= 0; --i) + for (int i = LOG - 1; i >= 0; --i) if (par[a][i] != -1 && par[a][i] != par[b][i]) { ans = op(ans, op(cost[a][i], cost[b][i])); a = par[a][i]; diff --git a/algorithms/structure/lazy_segment_tree.cpp b/algorithms/structure/lazy_segment_tree.cpp index b3d95f7..e2d45de 100644 --- a/algorithms/structure/lazy_segment_tree.cpp +++ b/algorithms/structure/lazy_segment_tree.cpp @@ -5,6 +5,10 @@ /// - update: O(log n) /// - query: O(log n) /// Space: O(n) +/// +/// Caution: +/// - Provide value for N before any operation +/// - Provide identity value if necessary (default is T()) #define left(x) (x << 1) #define right(x) ((x << 1) + 1) @@ -15,14 +19,12 @@ template <typename T> struct LazySegmentTree { using func = function<T(T,T)>; - T id; func op; + T id = T(); vector<T> tree, lazy; - LazySegmentTree(vector<T> &v, func op, T id=T()) : - tree(MAX*4, 0), lazy(MAX*4, 0), - op(op), id(id) - { build(v); } + LazySegmentTree(func op) : + op(op), tree(MAX*4, 0), lazy(MAX*4, 0) {} void build(const vector<T> &v, int node = 1, int l = 0, int r = N - 1) diff --git a/algorithms/structure/segment_tree.cpp b/algorithms/structure/segment_tree.cpp index c62f76d..50727c5 100644 --- a/algorithms/structure/segment_tree.cpp +++ b/algorithms/structure/segment_tree.cpp @@ -6,33 +6,69 @@ /// Space: O(n) /// /// Caution: -/// - Query returns $op([l,r))$ +/// - Provide value for N before any operation /// - Provide identity value if necessary (default is T()) +#define left(x) (x << 1) +#define right(x) ((x << 1) + 1) + +int N; + template <typename T> struct SegmentTree { using func = function<T(T,T)>; - T id; - int N; func op; + T ident = T(); vector<T> tree; - SegmentTree(int N, func op, T id = T()) : - N(N), op(op), id(id), tree(2*N, id) {} + SegmentTree(func op) : + op(op), tree(MAX*4) {} + + void build(const vector<T> &v, + int node = 1, int l = 0, int r = N - 1) + { + if (l > r) + return; - void update(int idx, T val) { - tree[idx + N] = val; - for (idx += N; idx > 1; idx/=2) - tree[idx/2] = op(tree[idx & ~1], tree[idx | 1]); + if (l == r) + tree[node] = v[l]; + else { + int m = (l + r) / 2; + build(v, left(node), l, m); + build(v, right(node), m + 1, r); + tree[node] = op(tree[left(node)], tree[right(node)]); + } } - T query(int l, int r) { - T ans = id; - for (l += N, r += N ; l < r; l/=2, r/=2) { - if (l & 1) ans = op(ans, tree[l++]); - if (r & 1) ans = op(ans, tree[--r]); + void update(int i, T val, + int node = 1, int l = 0, int r = N - 1) + { + if (l > r || l > i || r < i) + return; + + if (l == r) + tree[node] = val; + else { + int m = (l + r) / 2; + update(i, val, left(node), l, m); + update(i, val, right(node), m + 1, r); + tree[node] = op(tree[left(node)], tree[right(node)]); } - return ans; + } + + T query(int i, int j, + int node = 1, int l = 0, int r = N - 1) + { + if (l > r || l > j || r < i) + return ident; + + if (l >= i && r <= j) + return tree[node]; + + int m = (l + r) / 2; + T q1 = query(i, j, left(node), l, m); + T q2 = query(i, j, right(node), m + 1, r); + return op(q1, q2); } }; diff --git a/contests/Cadernaveis/LA5138.cpp b/contests/Cadernaveis/LA5138.cpp new file mode 100644 index 0000000..732fc82 --- /dev/null +++ b/contests/Cadernaveis/LA5138.cpp @@ -0,0 +1,95 @@ +#include <bits/stdc++.h> + +#define EPS 1e-6 +#define MOD 1000000007 +#define inf 0x3f3f3f3f +#define llinf 0x3f3f3f3f3f3f3f3f + +#define fi first +#define se second +#define pb push_back +#define ende '\n' + +#define all(x) (x).begin(), (x).end() +#define rall(x) (x).rbegin(), (x).rend() +#define mset(x, y) memset(&x, (y), sizeof(x)) + +using namespace std; + +using ll = long long; +using ii = pair<int,int>; + +using point = pair<double,double>; + +bool cw(point a, point b, point c) { + return (b.fi - a.fi) * (c.se - a.se) - \ + (b.se - a.se) * (c.fi - a.fi) <= 0; +} + +//double cross(point a, point b, point c) { +// return (b.fi - a.fi) * (c.se - a.se) - \ +// (b.se - a.se) * (c.fi - a.fi); +//} +double cross(const point &o, const point &a, const point &b) { + return (a.fi - o.fi) * (b.se - o.se) - (a.se - o.se) * (b.fi - o.fi); +} + +vector<point> convex_hull(vector<point> &v) { + int k = 0; + vector<point> ans(v.size() * 2); + + sort(all(v), [](const point &a, const point &b) { + return (a.fi == b.fi) ? (a.se < b.se) : (a.fi < b.fi); + }); + + for (int i = 0; i < v.size(); ++i) { + for (; k >= 2 && cw(ans[k-2], ans[k-1], v[i]); --k); + ans[k++] = v[i]; + } + + for (int i = v.size() - 2, t = k + 1; i >= 0; --i) { + for (; k >= t && cw(ans[k-2], ans[k-1], v[i]); --k); + ans[k++] = v[i]; + } + + ans.resize(k); + return ans; +} + +double dist_line(point p, point a, point b) { + return cross(b, a, p) / sqrt((b.se-a.se) * (b.se-a.se) + (b.fi-a.fi)*(b.fi-a.fi)); +} + +double width(vector<point> &v) { + vector<point> h = convex_hull(v); + int n = h.size() - 1; + int j = 1; + + double ans = 1e14; + h[0] = h[n]; + for (int i = 1; i <= n; ++i) { + while (cross(h[i-1], h[i], h[j%n+1]) > cross(h[i-1], h[i], h[j])) + j = j % n + 1; + ans = min(ans, dist_line(h[j], h[i], h[i-1])); + } + + return ceil(ans*100)/100; +} + +int main() { + ios::sync_with_stdio(0); + cin.tie(0); + cout << setprecision(2) << fixed; + + int n, cas = 1; + while (cin >> n && n) { + vector<point> v(n); + for (int i = 0; i < n; ++i) + cin >> v[i].fi >> v[i].se; + + cout << "Case " << cas << ": " << width(v) << ende; + cas++; + } + + return 0; +} diff --git a/contests/Cadernaveis/a.out b/contests/Cadernaveis/a.out new file mode 100755 index 0000000000000000000000000000000000000000..4768325f00306911ab20830aec41303b7e9a1c5e GIT binary patch literal 51416 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 Osz-6;yDGSf#{UIR94m|f literal 0 HcmV?d00001 diff --git a/contests/Cadernaveis/in b/contests/Cadernaveis/in new file mode 100644 index 0000000..1f16e89 --- /dev/null +++ b/contests/Cadernaveis/in @@ -0,0 +1,10 @@ +3 +0 0 +3 0 +0 4 +4 +0 10 +10 0 +20 10 +10 20 +0 diff --git a/contests/Cadernaveis/out b/contests/Cadernaveis/out new file mode 100644 index 0000000..6552e7d --- /dev/null +++ b/contests/Cadernaveis/out @@ -0,0 +1,369 @@ +Case 1: 2.40 +Case 2: 14.15 +Case 3: 0.71 +Case 4: 0.71 +Case 5: 0.71 +Case 6: 0.71 +Case 7: 0.71 +Case 8: 0.71 +Case 9: 0.01 +Case 10: 0.01 +Case 11: 0.01 +Case 12: 0.01 +Case 13: 0.01 +Case 14: 0.01 +Case 15: 10000.00 +Case 16: 26.00 +Case 17: 26.00 +Case 18: 26.00 +Case 19: 26.00 +Case 20: 26.00 +Case 21: 26.00 +Case 22: 2.00 +Case 23: 2.00 +Case 24: 2.00 +Case 25: 2.00 +Case 26: 2.00 +Case 27: 2.00 +Case 28: 26.00 +Case 29: 26.00 +Case 30: 26.00 +Case 31: 26.00 +Case 32: 26.00 +Case 33: 26.00 +Case 34: 421.90 +Case 35: 421.90 +Case 36: 421.90 +Case 37: 421.90 +Case 38: 421.90 +Case 39: 421.90 +Case 40: 313.62 +Case 41: 313.62 +Case 42: 313.62 +Case 43: 313.62 +Case 44: 313.62 +Case 45: 313.62 +Case 46: 739.83 +Case 47: 739.83 +Case 48: 739.83 +Case 49: 739.83 +Case 50: 739.83 +Case 51: 739.83 +Case 52: 939.89 +Case 53: 939.89 +Case 54: 939.89 +Case 55: 939.89 +Case 56: 939.89 +Case 57: 939.89 +Case 58: 943.66 +Case 59: 943.66 +Case 60: 943.66 +Case 61: 943.66 +Case 62: 943.66 +Case 63: 943.66 +Case 64: 965.95 +Case 65: 965.95 +Case 66: 965.95 +Case 67: 965.95 +Case 68: 965.95 +Case 69: 965.95 +Case 70: 941.45 +Case 71: 941.45 +Case 72: 941.45 +Case 73: 941.45 +Case 74: 941.45 +Case 75: 941.45 +Case 76: 827.61 +Case 77: 827.61 +Case 78: 827.61 +Case 79: 827.61 +Case 80: 827.61 +Case 81: 827.61 +Case 82: 962.07 +Case 83: 962.07 +Case 84: 962.07 +Case 85: 962.07 +Case 86: 962.07 +Case 87: 962.07 +Case 88: 522.79 +Case 89: 522.79 +Case 90: 522.79 +Case 91: 522.79 +Case 92: 522.79 +Case 93: 522.79 +Case 94: 868.59 +Case 95: 868.59 +Case 96: 868.59 +Case 97: 868.59 +Case 98: 868.59 +Case 99: 868.59 +Case 100: 943.42 +Case 101: 943.42 +Case 102: 943.42 +Case 103: 943.42 +Case 104: 943.42 +Case 105: 943.42 +Case 106: 849.02 +Case 107: 849.02 +Case 108: 849.02 +Case 109: 849.02 +Case 110: 849.02 +Case 111: 849.02 +Case 112: 872.17 +Case 113: 872.17 +Case 114: 872.17 +Case 115: 872.17 +Case 116: 872.17 +Case 117: 872.17 +Case 118: 918.82 +Case 119: 918.82 +Case 120: 918.82 +Case 121: 918.82 +Case 122: 918.82 +Case 123: 918.82 +Case 124: 830.42 +Case 125: 830.42 +Case 126: 830.42 +Case 127: 830.42 +Case 128: 830.42 +Case 129: 830.42 +Case 130: 887.99 +Case 131: 887.99 +Case 132: 887.99 +Case 133: 887.99 +Case 134: 887.99 +Case 135: 887.99 +Case 136: 819.72 +Case 137: 819.72 +Case 138: 819.72 +Case 139: 819.72 +Case 140: 819.72 +Case 141: 819.72 +Case 142: 916.86 +Case 143: 916.86 +Case 144: 916.86 +Case 145: 916.86 +Case 146: 916.86 +Case 147: 916.86 +Case 148: 894.85 +Case 149: 894.85 +Case 150: 894.85 +Case 151: 894.85 +Case 152: 894.85 +Case 153: 894.85 +Case 154: 907.85 +Case 155: 907.85 +Case 156: 907.85 +Case 157: 907.85 +Case 158: 907.85 +Case 159: 907.85 +Case 160: 897.52 +Case 161: 897.52 +Case 162: 897.52 +Case 163: 897.52 +Case 164: 897.52 +Case 165: 897.52 +Case 166: 698.88 +Case 167: 698.88 +Case 168: 698.88 +Case 169: 698.88 +Case 170: 698.88 +Case 171: 698.88 +Case 172: 520.04 +Case 173: 520.04 +Case 174: 520.04 +Case 175: 520.04 +Case 176: 520.04 +Case 177: 520.04 +Case 178: 948.53 +Case 179: 948.53 +Case 180: 948.53 +Case 181: 948.53 +Case 182: 948.53 +Case 183: 948.53 +Case 184: 890.01 +Case 185: 890.01 +Case 186: 890.01 +Case 187: 890.01 +Case 188: 890.01 +Case 189: 890.01 +Case 190: 863.93 +Case 191: 863.93 +Case 192: 863.93 +Case 193: 863.93 +Case 194: 863.93 +Case 195: 863.93 +Case 196: 902.07 +Case 197: 902.07 +Case 198: 902.07 +Case 199: 902.07 +Case 200: 902.07 +Case 201: 902.07 +Case 202: 841.60 +Case 203: 841.60 +Case 204: 841.60 +Case 205: 841.60 +Case 206: 841.60 +Case 207: 841.60 +Case 208: 887.03 +Case 209: 887.03 +Case 210: 887.03 +Case 211: 887.03 +Case 212: 887.03 +Case 213: 887.03 +Case 214: 677.03 +Case 215: 677.03 +Case 216: 677.03 +Case 217: 677.03 +Case 218: 677.03 +Case 219: 677.03 +Case 220: 917.60 +Case 221: 917.60 +Case 222: 917.60 +Case 223: 917.60 +Case 224: 917.60 +Case 225: 917.60 +Case 226: 699.30 +Case 227: 699.30 +Case 228: 699.30 +Case 229: 699.30 +Case 230: 699.30 +Case 231: 699.30 +Case 232: 781.85 +Case 233: 781.85 +Case 234: 781.85 +Case 235: 781.85 +Case 236: 781.85 +Case 237: 781.85 +Case 238: 635.53 +Case 239: 635.53 +Case 240: 635.53 +Case 241: 635.53 +Case 242: 635.53 +Case 243: 635.53 +Case 244: 846.09 +Case 245: 846.09 +Case 246: 846.09 +Case 247: 846.09 +Case 248: 846.09 +Case 249: 846.09 +Case 250: 553.25 +Case 251: 553.25 +Case 252: 553.25 +Case 253: 553.25 +Case 254: 553.25 +Case 255: 553.25 +Case 256: 971.14 +Case 257: 971.14 +Case 258: 971.14 +Case 259: 971.14 +Case 260: 971.14 +Case 261: 971.14 +Case 262: 834.71 +Case 263: 834.71 +Case 264: 834.71 +Case 265: 834.71 +Case 266: 834.71 +Case 267: 834.71 +Case 268: 857.93 +Case 269: 857.93 +Case 270: 857.93 +Case 271: 857.93 +Case 272: 857.93 +Case 273: 857.93 +Case 274: 929.54 +Case 275: 929.54 +Case 276: 929.54 +Case 277: 929.54 +Case 278: 929.54 +Case 279: 929.54 +Case 280: 882.55 +Case 281: 882.55 +Case 282: 882.55 +Case 283: 882.55 +Case 284: 882.55 +Case 285: 882.55 +Case 286: 920.93 +Case 287: 920.93 +Case 288: 920.93 +Case 289: 920.93 +Case 290: 920.93 +Case 291: 920.93 +Case 292: 885.83 +Case 293: 885.83 +Case 294: 885.83 +Case 295: 885.83 +Case 296: 885.83 +Case 297: 885.83 +Case 298: 969.79 +Case 299: 969.79 +Case 300: 969.79 +Case 301: 969.79 +Case 302: 969.79 +Case 303: 969.79 +Case 304: 935.10 +Case 305: 935.10 +Case 306: 935.10 +Case 307: 935.10 +Case 308: 935.10 +Case 309: 935.10 +Case 310: 821.22 +Case 311: 821.22 +Case 312: 821.22 +Case 313: 821.22 +Case 314: 821.22 +Case 315: 821.22 +Case 316: 936.47 +Case 317: 936.47 +Case 318: 936.47 +Case 319: 936.47 +Case 320: 936.47 +Case 321: 936.47 +Case 322: 669.83 +Case 323: 669.83 +Case 324: 669.83 +Case 325: 669.83 +Case 326: 669.83 +Case 327: 669.83 +Case 328: 937.78 +Case 329: 937.78 +Case 330: 937.78 +Case 331: 937.78 +Case 332: 937.78 +Case 333: 937.78 +Case 334: 911.71 +Case 335: 911.71 +Case 336: 911.71 +Case 337: 911.71 +Case 338: 911.71 +Case 339: 911.71 +Case 340: 878.29 +Case 341: 878.29 +Case 342: 878.29 +Case 343: 878.29 +Case 344: 878.29 +Case 345: 878.29 +Case 346: 911.88 +Case 347: 911.88 +Case 348: 911.88 +Case 349: 911.88 +Case 350: 911.88 +Case 351: 911.88 +Case 352: 819.50 +Case 353: 819.50 +Case 354: 819.50 +Case 355: 819.50 +Case 356: 819.50 +Case 357: 819.50 +Case 358: 914.16 +Case 359: 914.16 +Case 360: 914.16 +Case 361: 914.16 +Case 362: 914.16 +Case 363: 914.16 +Case 364: 525.55 +Case 365: 525.55 +Case 366: 525.55 +Case 367: 525.55 +Case 368: 525.55 +Case 369: 525.55 -- GitLab