제출 #49047

#제출 시각아이디문제언어결과실행 시간메모리
49047BThero새 집 (APIO18_new_home)C++17
12 / 100
3594 ms295688 KiB
// Why am I so stupid? :c #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define all(x) (x).begin(), (x).end() #define fi first #define se second typedef long long ll; using namespace std; const int MAXN = 3e5+5; const int INF = 1e9; struct shop { int x, tp, l, r; shop() { x = tp = l = r = 0; } } arr[MAXN]; struct que { int x, t, id; que() { x = t = id = 0; } } req[MAXN]; vector < pair <int, int> > addEl[MAXN * 3], delEl[MAXN * 3], reqEl[MAXN * 3]; multiset <int> ms[MAXN * 3]; vector <int> mm[MAXN]; int rl[MAXN * 3]; int ans[MAXN]; int mn[MAXN]; int n, k, q; int m, m2; void compressTime() { vector <int> vv; for (int i = 1; i <= n; ++i) { vv.pb(arr[i].l); vv.pb(arr[i].r); } for (int i = 1; i <= q; ++i) { vv.pb(req[i].t); } sort(all(vv)); vv.resize(unique(all(vv)) - vv.begin()); m = vv.size(); for (int i = 1; i <= n; ++i) { arr[i].l = upper_bound(all(vv), arr[i].l) - vv.begin(); arr[i].r = upper_bound(all(vv), arr[i].r) - vv.begin(); } for (int i = 1; i <= q; ++i) { req[i].t = upper_bound(all(vv), req[i].t) - vv.begin(); } } void compressX() { vector <int> vv; for (int i = 1; i <= n; ++i) { vv.pb(arr[i].x); } for (int i = 1; i <= q; ++i) { vv.pb(req[i].x); } sort(all(vv)); vv.resize(unique(all(vv)) - vv.begin()); m2 = vv.size(); for (int i = 1, ps; i <= n; ++i) { ps = upper_bound(all(vv), arr[i].x) - vv.begin(); rl[ps] = arr[i].x; arr[i].x = ps; } for (int i = 1, ps; i <= q; ++i) { ps = upper_bound(all(vv), req[i].x) - vv.begin(); rl[ps] = req[i].x; req[i].x = ps; } } int dist(int x, multiset <int> &M) { auto it = M.upper_bound(x); int ret = INF; if (it != M.end()) { ret = min(ret, rl[*it] - rl[x]); } if (it != M.begin()) { ret = min(ret, rl[x] - rl[*(--it)]); } return ret; } bool cmp(que a, que b) { return a.x < b.x; } void solve() { scanf("%d %d %d", &n, &k, &q); for (int i = 1; i <= n; ++i) { scanf("%d %d", &arr[i].x, &arr[i].tp); scanf("%d %d", &arr[i].l, &arr[i].r); } for (int i = 1; i <= q; ++i) { scanf("%d %d", &req[i].x, &req[i].t); req[i].id = i; } compressX(); if (k <= 400) { compressTime(); for (int i = 1; i <= n; ++i) { addEl[arr[i].l].pb(mp(arr[i].x, arr[i].tp)); delEl[arr[i].r + 1].pb(mp(arr[i].x, arr[i].tp)); } for (int i = 1; i <= q; ++i) { reqEl[req[i].t].pb(mp(req[i].x, i)); } for (int i = 1; i <= m; ++i) { for (auto it : addEl[i]) { ms[it.se].insert(it.fi); } for (auto it : delEl[i]) { ms[it.se].erase(ms[it.se].find(it.fi)); } for (auto it : reqEl[i]) { for (int j = 1; j <= k; ++j) { ans[it.se] = max(ans[it.se], dist(it.fi, ms[j])); } } } } else { sort(req + 1, req + q + 1, cmp); for (int i = 1; i <= n; ++i) { mm[arr[i].tp].pb(arr[i].x); } bool ex = 0; for (int i = 1; i <= k; ++i) { if (mm[i].empty()) { ex = 1; } sort(all(mm[i])); } if (ex) { for (int i = 1; i <= q; ++i) { printf("-1\n"); } return; } for (int i = 1; i <= k; ++i) { mm[i].pb(1); for (int j = 0; j < mm[i].size(); ++j) { int nxt = (j + 1 < mm[i].size() ? mm[i][j + 1] : m2); addEl[mm[i][j]].pb(mp(mm[i][j], nxt)); delEl[nxt + 1].pb(mp(mm[i][j], nxt)); } } multiset < pair <int, int> > yu; int ptr = 1; for (int i = 1; i <= m2; ++i) { for (auto it : addEl[i]) { yu.insert(it); } for (auto it : delEl[i]) { yu.erase(yu.find(it)); } while (ptr <= q && req[ptr].x <= i) { for (auto it : yu) { int curD = min(rl[req[ptr].x] - rl[it.fi], rl[it.se] - rl[req[ptr].x]); ans[req[ptr].id] = max(ans[req[ptr].id], curD); } ++ptr; } } } for (int i = 1; i <= q; ++i) { if (ans[i] == INF) { ans[i] = -1; } printf("%d\n", ans[i]); } } int main() { #ifdef BThero freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif // BThero int tt = 1; while (tt--) { solve(); } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

new_home.cpp: In function 'void solve()':
new_home.cpp:198:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for (int j = 0; j < mm[i].size(); ++j) {
                             ~~^~~~~~~~~~~~~~
new_home.cpp:199:34: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 int nxt = (j + 1 < mm[i].size() ? mm[i][j + 1] : m2);
                            ~~~~~~^~~~~~~~~~~~~~
new_home.cpp:128:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d %d", &n, &k, &q);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:131:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &arr[i].x, &arr[i].tp);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:132:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &arr[i].l, &arr[i].r);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:136:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &req[i].x, &req[i].t);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...