# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
331983 | 2020-11-30T23:05:52 Z | ijxjdjd | Circus (Balkan15_CIRCUS) | C++11 | 207 ms | 8616 KB |
#include "circus.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef string str; typedef double db; typedef long double ld; typedef pair<int, int> pi; typedef pair<long, long> pl; typedef vector<int> vi; typedef vector<ll> vl; typedef vector<pi> vpi; struct st { public: int from; int t; int cur; }; bool operator<(const st& lhs, const st& rhs) { return rhs.t < lhs.t; } const int MAXN = (int)(1e5) + 5; int to[MAXN]; int from[MAXN+5]; bool seen[MAXN+5]; int ans[MAXN+5]; int sP[MAXN+5]; int s1[MAXN+5]; int Ns; int findF(int i) { if (i == MAXN) { return MAXN; } if (seen[to[i]]) { to[i] = findF(to[i]); } return to[i]; } int findB(int i) { if (i == MAXN){ return MAXN; } if (seen[from[i]]) { from[i] = findB(from[i]); } return from[i]; } set<pi> still; priority_queue<st> pq; void init(int N, int M, int P[]){ sort(P, P+N); for (int i = 0; i < N; i++) { sP[i] = P[i]; } sP[N] = M; for (int i = 0; i < N; i++) { still.insert({P[i], i}); } fill(ans, ans+N, (int)(2e9)); N++; Ns = N; seen[N-1] = true; from[0] = MAXN; to[N-1] = MAXN; ans[N-1] = 0; for (int i = 1; i < N; i++) { from[i] = i-1; } for (int i = 0; i < N-1; i++) { to[i] = i+1; } pq.push({N-1, M-P[N-2], N-2}); ans[N-2] = M-P[N-2]; while (still.size() > 0) { st next = pq.top(); pq.pop(); if (ans[next.cur] == next.t) { seen[next.cur] = true; still.erase({P[next.cur], next.cur}); auto top = still.lower_bound({P[next.cur]+next.t, -1}); auto bot = still.upper_bound({P[next.cur]-next.t, N}); if (bot != still.begin()) { bot--; pq.push({next.cur, P[next.cur] - (*bot).first, (*bot).second}); ans[(*bot).second] = min(ans[(*bot).second], P[next.cur] - (*bot).first); } if (top != still.end()) { pq.push({next.cur, (*top).first - P[next.cur], (*top).second}); ans[(*top).second] = min(ans[(*top).second], (*top).first - P[next.cur]); } } if (next.cur < next.from) { int n = findB(next.cur); if (n != MAXN) { pq.push({next.from, (next.from == N-1 ? M : P[next.from]) - P[n], n}); ans[n] = min(ans[n], (next.from == N-1 ? M : P[next.from])-P[n]); } } else { int n = findF(next.cur); if (n != MAXN) { pq.push({next.from, P[n]-P[next.from], n}); ans[n] = min(ans[n], P[n] - P[next.from]); } } } s1[N-1] = 0; for (int i = N-2; i >= 0; i--) { s1[i] = P[i] - ans[i]; if (i != N-1) { s1[i] = max(s1[i], s1[i+1]); } } } int minLength(int D) { int low = 0; int high = Ns-1; while (low < high) { int mid = (low + high)/2; if (sP[low] <= D) { low = mid+1; } else { high = mid; } } low = high; high = Ns-1; while (low < high) { int mid = (low + high)/2; if (s1[mid] >= D) { high = mid; } else { low = mid+1; } } return sP[low] - D; }
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 207 ms | 8616 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 1 ms | 364 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 1 ms | 364 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 1 ms | 364 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 207 ms | 8616 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 207 ms | 8616 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |