Skip to content
Snippets Groups Projects
Commit b353ac9a authored by Bruno Freitas Tissei's avatar Bruno Freitas Tissei
Browse files

Update SBC19

parent 92083fae
No related branches found
No related tags found
No related merge requests found
...@@ -26,12 +26,6 @@ using ii = pair<int,int>; ...@@ -26,12 +26,6 @@ using ii = pair<int,int>;
int N = 100001; int N = 100001;
int tree[MAX*4], cnt[MAX*4]; 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, void update(int i, int j, int val,
int node = 1, int l = 0, int r = N - 1) { int node = 1, int l = 0, int r = N - 1) {
if (l > r || l > j || r < i) return; if (l > r || l > j || r < i) return;
...@@ -51,15 +45,13 @@ struct LazySegmentTree { ...@@ -51,15 +45,13 @@ struct LazySegmentTree {
if (l < r) cnt[node] = cnt[left(node)] + cnt[right(node)]; if (l < r) cnt[node] = cnt[left(node)] + cnt[right(node)];
} }
} }
};
struct Segment { struct Segment {
int x1, y1, x2, y2; int x1, y1, x2, y2;
Segment() {} Segment() {}
Segment(int x1, int y1, int x2, int y2) : 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 { struct Event {
...@@ -74,10 +66,11 @@ struct Event { ...@@ -74,10 +66,11 @@ struct Event {
Segment rect; Segment rect;
vector<Event> E; vector<Event> E;
vector<Segment> ss; vector<Segment> ss;
LazySegmentTree seg;
double calc(int m) { double calc(int m, ll p) {
seg.init(); mset(tree, 0);
mset(cnt, 0);
int k = 0; int k = 0;
for (int i = 0; i < ss.size(); ++i) { for (int i = 0; i < ss.size(); ++i) {
E[k++] = Event(ss[i].x1 - m, ss[i].x2 + m, ss[i].y1 - m, 1); E[k++] = Event(ss[i].x1 - m, ss[i].x2 + m, ss[i].y1 - m, 1);
...@@ -93,11 +86,11 @@ double calc(int m) { ...@@ -93,11 +86,11 @@ double calc(int m) {
for (int i = rect.y1; i < rect.y2; ++i) { for (int i = rect.y1; i < rect.y2; ++i) {
for (; k < E.size() && E[k].y <= i; ++k) for (; k < E.size() && E[k].y <= i; ++k)
if (E[k].x1 <= rect.x2 - 1 && E[k].x2 >= rect.x1) 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]; 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() { int main() {
...@@ -114,14 +107,14 @@ int main() { ...@@ -114,14 +107,14 @@ int main() {
i = Segment(min(x1,x2), min(y1,y2), max(x1,x2), max(y1,y2)); 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; int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2; cin >> x1 >> y1 >> x2 >> y2;
rect = Segment(min(x1,x2), min(y1,y2), max(x1,x2), max(y1,y2)); rect = Segment(min(x1,x2), min(y1,y2), max(x1,x2), max(y1,y2));
int l = 0, r = 101010; int l = 0, r = 101010;
for (int b = r / 2; b >= 1; b /= 2) for (int b = r / 2; b >= 1; b /= 2)
while (calc(l + b) < p) while (calc(l + b, p))
l += b; l += b;
cout << l + 1 << ende; cout << l + 1 << ende;
......
...@@ -20,65 +20,66 @@ using namespace std; ...@@ -20,65 +20,66 @@ using namespace std;
using ll = long long; using ll = long long;
using ii = pair<int,int>; using ii = pair<int,int>;
int graph[MAX][MAX]; int dist[2][MAX][MAX];
int dist[2][MAX][MAX][MAX];
struct Query { int idx, a, b, k, t; };
int main() { int main() {
ios::sync_with_stdio(0); ios::sync_with_stdio(0);
cin.tie(0); cin.tie(0);
int n, r; cin >> n >> r; int n, r; cin >> n >> r;
vector<ii> T[2];
vector<ii> t(n);
for (int i = 0; i < n; ++i) { for (int i = 0; i < n; ++i) {
cin >> t[i].fi; int x; cin >> x;
t[i].se = i; T[0].pb({x, i});
T[1].pb({x, i});
dist[0][i][i] = dist[1][i][i] = 0;
} }
vector<ii> t0 = t; sort(all(T[0]));
vector<ii> t1 = t; sort(rall(T[1]));
sort(all(t0));
sort(rall(t1));
mset(dist, inf);
for (int i = 0; i < r; ++i) { for (int i = 0; i < r; ++i) {
int a, b, c; cin >> a >> b >> c; a--, b--; int a, b, c; cin >> a >> b >> c; a--, b--;
graph[a][b] = c; dist[0][a][b] = dist[1][a][b] = c;
graph[b][a] = c; dist[0][b][a] = dist[1][b][a] = c;
} }
mset(dist, inf); int q; cin >> q;
for (int i = 0; i < n; ++i) vector<Query> Q(q);
for (int j = 0; j < n; ++j) for (int i = 0; i < q; ++i) {
if (i == j) int a, b, k, t; cin >> a >> b >> k >> t; a--, b--;
dist[0][0][i][j] = dist[1][0][i][j] = 0; Q[i] = Query{i, a, b, k, t};
else if (graph[i][j]) }
dist[0][0][i][j] = dist[1][0][i][j] = graph[i][j];
sort(all(Q), [&](Query a, Query b) {
if (a.t == b.t) return a.k < b.k;
return a.t < b.t;
});
int kk0 = 1, kk1 = 1; int curr = 0;
vector<int> ans(q);
for (int tt = 0; tt <= 1; ++tt) {
int kk = 1;
for (int k = 0; k < n; ++k) { for (int k = 0; k < n; ++k) {
if (k && t0[k].fi != t0[k-1].fi) kk0++; if (k && T[tt][k].fi != T[tt][k-1].fi) {
if (k && t1[k].fi != t1[k-1].fi) kk1++; 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 i = 0; i < n; ++i)
for (int j = 0; j < n; ++j) { 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[tt][i][j] = min(dist[tt][i][j], dist[tt][i][T[tt][k].se] + dist[tt][T[tt][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]});
}
} }
for (int k = kk0 + 1; k <= n; ++k) for (; curr < q && Q[curr].t == tt; ++curr)
memcpy(dist[0][k], dist[0][k-1], sizeof dist[0][k]); ans[Q[curr].idx] = dist[tt][Q[curr].a][Q[curr].b];
for (int k = kk1 + 1; k <= n; ++k)
memcpy(dist[1][k], dist[1][k-1], sizeof dist[1][k]);
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 (auto i : ans)
cout << ((i == inf) ? -1 : i) << ende;
return 0; return 0;
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment