diff --git a/contests/SBC19/F.cpp b/contests/SBC19/F.cpp index daea4fc898397648f27a7ad06b3a21ef0f447200..6e6fc57044bbad5fa8d14f2e038774fa1eaf22b0 100644 --- a/contests/SBC19/F.cpp +++ b/contests/SBC19/F.cpp @@ -26,40 +26,32 @@ using ii = pair<int,int>; int N = 100001; int tree[MAX*4], cnt[MAX*4]; -struct LazySegmentTree { - void init() { - mset(tree, 0); - mset(cnt, 0); +void update(int i, int j, int val, + int node = 1, int l = 0, int r = N - 1) { + if (l > r || l > j || r < i) return; + + if (i <= l && r <= j) + tree[node] += val; + else { + int m = (l + r) / 2; + update(i, j, val, left(node), l, m); + update(i, j, val, right(node), m + 1, r); } - void update(int i, int j, int val, - int node = 1, int l = 0, int r = N - 1) { - if (l > r || l > j || r < i) return; - - if (i <= l && r <= j) - tree[node] += val; - else { - int m = (l + r) / 2; - update(i, j, val, left(node), l, m); - update(i, j, val, right(node), m + 1, r); - } - - if (tree[node]) - cnt[node] = r - l + 1; - else { - cnt[node] = 0; - if (l < r) cnt[node] = cnt[left(node)] + cnt[right(node)]; - } + if (tree[node]) + cnt[node] = r - l + 1; + else { + cnt[node] = 0; + if (l < r) cnt[node] = cnt[left(node)] + cnt[right(node)]; } -}; +} struct Segment { int x1, y1, x2, y2; Segment() {} Segment(int x1, int y1, int x2, int y2) : - x1(x1), y1(y1), x2(x2), y2(y2) - {} + x1(x1), y1(y1), x2(x2), y2(y2) {} }; struct Event { @@ -74,10 +66,11 @@ struct Event { Segment rect; vector<Event> E; vector<Segment> ss; -LazySegmentTree seg; -double calc(int m) { - seg.init(); +double calc(int m, ll p) { + mset(tree, 0); + mset(cnt, 0); + int k = 0; for (int i = 0; i < ss.size(); ++i) { E[k++] = Event(ss[i].x1 - m, ss[i].x2 + m, ss[i].y1 - m, 1); @@ -93,11 +86,11 @@ double calc(int m) { for (int i = rect.y1; i < rect.y2; ++i) { for (; k < E.size() && E[k].y <= i; ++k) if (E[k].x1 <= rect.x2 - 1 && E[k].x2 >= rect.x1) - seg.update(max(rect.x1, E[k].x1), min(rect.x2 - 1, E[k].x2 - 1), E[k].beg); + update(max(rect.x1, E[k].x1), min(rect.x2 - 1, E[k].x2 - 1), E[k].beg); ans += (ll) cnt[1]; } - return ((ans*100) / ((ll) ((ll) rect.x2 - rect.x1) * ((ll) rect.y2 - rect.y1))); + return (ans*100) < p * ((ll) ((ll) rect.x2 - rect.x1) * ((ll) rect.y2 - rect.y1)); } int main() { @@ -114,14 +107,14 @@ int main() { i = Segment(min(x1,x2), min(y1,y2), max(x1,x2), max(y1,y2)); } - int p; cin >> p; + ll p; cin >> p; int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; rect = Segment(min(x1,x2), min(y1,y2), max(x1,x2), max(y1,y2)); int l = 0, r = 101010; for (int b = r / 2; b >= 1; b /= 2) - while (calc(l + b) < p) + while (calc(l + b, p)) l += b; cout << l + 1 << ende; diff --git a/contests/SBC19/G.cpp b/contests/SBC19/G.cpp index 87d8d6f08e7358644afd0c8588b98e4d72ed6a9d..2c8ce39e7a557f400e9f28dac5cfc698c73c6f65 100644 --- a/contests/SBC19/G.cpp +++ b/contests/SBC19/G.cpp @@ -105,7 +105,7 @@ int main() { double x; cin >> x; mcmf.add_edge(i+1, j+1+n, 1, -log(x)); } - mcmf.add_edge(i+n+1,2*n+1, 1, 0); + mcmf.add_edge(i+n+1, 2*n+1, 1, 0); } vector<int> ans(n); diff --git a/contests/SBC19/I.cpp b/contests/SBC19/I.cpp index 44fcd8cf8dee158b2521d94670e30a6787761fe8..0f929cb156139ea3b366a708ecc0df7276242a0b 100644 --- a/contests/SBC19/I.cpp +++ b/contests/SBC19/I.cpp @@ -20,65 +20,66 @@ using namespace std; using ll = long long; using ii = pair<int,int>; -int graph[MAX][MAX]; -int dist[2][MAX][MAX][MAX]; +int dist[2][MAX][MAX]; + +struct Query { int idx, a, b, k, t; }; int main() { ios::sync_with_stdio(0); cin.tie(0); int n, r; cin >> n >> r; - - vector<ii> t(n); + vector<ii> T[2]; for (int i = 0; i < n; ++i) { - cin >> t[i].fi; - t[i].se = i; + int x; cin >> x; + T[0].pb({x, i}); + T[1].pb({x, i}); + dist[0][i][i] = dist[1][i][i] = 0; } - vector<ii> t0 = t; - vector<ii> t1 = t; - - sort(all(t0)); - sort(rall(t1)); + sort(all(T[0])); + sort(rall(T[1])); + mset(dist, inf); for (int i = 0; i < r; ++i) { int a, b, c; cin >> a >> b >> c; a--, b--; - graph[a][b] = c; - graph[b][a] = c; + dist[0][a][b] = dist[1][a][b] = c; + dist[0][b][a] = dist[1][b][a] = c; } - mset(dist, inf); - for (int i = 0; i < n; ++i) - for (int j = 0; j < n; ++j) - if (i == j) - dist[0][0][i][j] = dist[1][0][i][j] = 0; - else if (graph[i][j]) - dist[0][0][i][j] = dist[1][0][i][j] = graph[i][j]; - - int kk0 = 1, kk1 = 1; - for (int k = 0; k < n; ++k) { - if (k && t0[k].fi != t0[k-1].fi) kk0++; - if (k && t1[k].fi != t1[k-1].fi) kk1++; - - for (int i = 0; i < n; ++i) - for (int j = 0; j < n; ++j) { - dist[0][kk0][i][j] = min({dist[0][kk0-1][i][j], dist[0][kk0-1][i][t0[k].se] + dist[0][kk0-1][t0[k].se][j], - dist[0][kk0][i][j], dist[0][kk0][i][t0[k].se] + dist[0][kk0][t0[k].se][j]}); - dist[1][kk1][i][j] = min({dist[1][kk1-1][i][j], dist[1][kk1-1][i][t1[k].se] + dist[1][kk1-1][t1[k].se][j], - dist[1][kk1][i][j], dist[1][kk1][i][t1[k].se] + dist[1][kk1][t1[k].se][j]}); - } + int q; cin >> q; + vector<Query> Q(q); + for (int i = 0; i < q; ++i) { + int a, b, k, t; cin >> a >> b >> k >> t; a--, b--; + Q[i] = Query{i, a, b, k, t}; } - for (int k = kk0 + 1; k <= n; ++k) - memcpy(dist[0][k], dist[0][k-1], sizeof dist[0][k]); - for (int k = kk1 + 1; k <= n; ++k) - memcpy(dist[1][k], dist[1][k-1], sizeof dist[1][k]); + sort(all(Q), [&](Query a, Query b) { + if (a.t == b.t) return a.k < b.k; + return a.t < b.t; + }); + + int curr = 0; + vector<int> ans(q); + for (int tt = 0; tt <= 1; ++tt) { + int kk = 1; + for (int k = 0; k < n; ++k) { + if (k && T[tt][k].fi != T[tt][k-1].fi) { + for (; curr < q && Q[curr].k == kk && Q[curr].t == tt; ++curr) + ans[Q[curr].idx] = dist[tt][Q[curr].a][Q[curr].b]; + kk++; + } + + for (int i = 0; i < n; ++i) + for (int j = 0; j < n; ++j) + dist[tt][i][j] = min(dist[tt][i][j], dist[tt][i][T[tt][k].se] + dist[tt][T[tt][k].se][j]); + } - int q; cin >> q; - while (q--) { - int a, b, k, t; cin >> a >> b >> k >> t; a--, b--; - cout << ((dist[t][k][a][b] == inf) ? -1 : dist[t][k][a][b]) << ende; + for (; curr < q && Q[curr].t == tt; ++curr) + ans[Q[curr].idx] = dist[tt][Q[curr].a][Q[curr].b]; } + for (auto i : ans) + cout << ((i == inf) ? -1 : i) << ende; return 0; }