답안 #876109

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
876109 2023-11-21T09:14:11 Z marvinthang 새 집 (APIO18_new_home) C++17
33 / 100
1720 ms 80556 KB
/*************************************
*    author: marvinthang             *
*    created: 21.11.2023 14:25:44    *
*************************************/

#include <bits/stdc++.h>

using namespace std;

#define                  fi  first
#define                  se  second
#define                left  ___left
#define               right  ___right
#define                TIME  (1.0 * clock() / CLOCKS_PER_SEC)
#define             MASK(i)  (1LL << (i))
#define           BIT(x, i)  ((x) >> (i) & 1)
#define  __builtin_popcount  __builtin_popcountll
#define              ALL(v)  (v).begin(), (v).end()
#define           REP(i, n)  for (int i = 0, _n = (n); i < _n; ++i)
#define          REPD(i, n)  for (int i = (n); i-- > 0; )
#define        FOR(i, a, b)  for (int i = (a), _b = (b); i < _b; ++i) 
#define       FORD(i, b, a)  for (int i = (b), _a = (a); --i >= _a; ) 
#define       FORE(i, a, b)  for (int i = (a), _b = (b); i <= _b; ++i) 
#define      FORDE(i, b, a)  for (int i = (b), _a = (a); i >= _a; --i) 
#define        scan_op(...)  istream & operator >> (istream &in, __VA_ARGS__ &u)
#define       print_op(...)  ostream & operator << (ostream &out, const __VA_ARGS__ &u)
#ifdef LOCAL
    #include "debug.h"
#else
    #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
    #define DB(...) 23
    #define db(...) 23
    #define debug(...) 23
#endif

template <class U, class V> scan_op(pair <U, V>)  { return in >> u.first >> u.second; }
template <class T> scan_op(vector <T>)  { for (size_t i = 0; i < u.size(); ++i) in >> u[i]; return in; }
template <class U, class V> print_op(pair <U, V>)  { return out << '(' << u.first << ", " << u.second << ')'; }
template <size_t i, class T> ostream & print_tuple_utils(ostream &out, const T &tup) { if constexpr(i == tuple_size<T>::value) return out << ")";  else return print_tuple_utils<i + 1, T>(out << (i ? ", " : "(") << get<i>(tup), tup); }
template <class ...U> print_op(tuple<U...>) { return print_tuple_utils<0, tuple<U...>>(out, u); }
template <class Con, class = decltype(begin(declval<Con>()))> typename enable_if <!is_same<Con, string>::value, ostream&>::type operator << (ostream &out, const Con &con) { out << '{'; for (__typeof(con.begin()) it = con.begin(); it != con.end(); ++it) out << (it == con.begin() ? "" : ", ") << *it; return out << '}'; }

// end of template

const int INF = 1e8 + 1;

struct Store {
	int x, t, a, b;
	Store(int x, int t, int a, int b): x(x), t(t), a(a), b(b) {}
};

void process(void) {
	int n, q, k; cin >> n >> k >> q;
	vector <multiset <int>> pos(k);
	vector <Store> stores;
	REP(i, n) {
		int x, t, a, b; cin >> x >> t >> a >> b; --t;
		stores.emplace_back(x, t, a, b);
		pos[t].insert(x);
	}

	map <int, int> up, down;
	for (auto &pos: pos) {
		if (pos.empty()) {
			REP(i, q) cout << "-1\n";
			return;
		}
		for (auto it = pos.begin(); it != pos.end(); ++it) {
			int r = next(it) == pos.end() ? INF : (*it + *next(it)) / 2;
			if (!up.count(-r)) up[-r] = r - *it;
			else up[-r] = max(up[-r], r - *it);
			int l = it == pos.begin() ? 0 : (*prev(it) + *it + 1) / 2;
			if (!down.count(l)) down[l] = *it - l;
			else down[l] = max(down[l], *it - l);
		}
	}

	int last = -INF;
	for (auto it = up.begin(); it != up.end(); ) {
		if (it->fi + it->se <= last) {
			it = up.erase(it);
		} else {
			last = it->fi + it->se;
			++it;
		}
	}

	for (auto it = down.begin(); it != down.end(); ) {
		if (it->fi + it->se <= last) {
			it = down.erase(it);
		} else {
			last = it->fi + it->se;
			++it;
		}
	}

	vector <pair <int, int>> queries(q); cin >> queries;

	vector <pair <int, int>> events;
	REP(i, n) events.emplace_back(stores[i].b + 1, i);
	REP(i, q) events.emplace_back(queries[i].se, i + n);
	sort(ALL(events));

	vector <int> res(q, -1);
	for (auto [y, i]: events) {
		if (i < n) {
			int t = stores[i].t;
			int x = stores[i].x;
			auto it = pos[t].erase(pos[t].find(x));
			if (pos[t].empty()) break;
			int prv = it == pos[t].begin() ? 0 : *prev(it);
			int nxt = it == pos[t].end() ? INF : *it;

			if (prv) {
				int r = nxt == INF ? INF : (prv + nxt) / 2;
				// (-r, r - prv);
				if (!up.count(-r) || up[-r] < r - prv) {
					up[-r] = r - prv;
					auto it = up.find(-r);
					if (it != up.begin() && prev(it)->fi + prev(it)->se > -prv) up.erase(it);
					else {
						++it;
						while (it != up.end() && -prv >= it->fi + it->se) it = up.erase(it);
					}
				}
			}

			if (nxt != INF) {
				int l = prv ? (prv + nxt + 1) / 2 : 0;
				// (l, nxt - l);
				if (!down.count(l) || down[l] < nxt - l) {
					down[l] = nxt - l;
					auto it = down.find(l);
					if (it != down.begin() && prev(it)->fi + prev(it)->se > nxt) down.erase(it);
					else {
						++it;
						while (it != down.end() && nxt >= it->fi + it->se) it = down.erase(it);
					}
				}
			}
		} else {
			i -= n;
			int l = queries[i].fi;
			auto it = prev(up.upper_bound(-l));
			res[i] = it->se + it->fi + l;
			it = prev(down.upper_bound(l));
			res[i] = max(res[i], it->se + it->fi - l);
		}
	}

	REP(i, q) cout << res[i] << '\n';
}

int main(void) {
	ios_base::sync_with_stdio(false); cin.tie(nullptr); // cout.tie(nullptr);
	file("new_home");
	// int t; cin >> t; while (t--)
	process();
	// cerr << "Time elapsed: " << TIME << " s.\n";
	return (0^0);
}

Compilation message

new_home.cpp: In function 'int main()':
new_home.cpp:30:61: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   30 |     #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
      |                                                      ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:156:2: note: in expansion of macro 'file'
  156 |  file("new_home");
      |  ^~~~
new_home.cpp:30:94: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   30 |     #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
      |                                                                                       ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:156:2: note: in expansion of macro 'file'
  156 |  file("new_home");
      |  ^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Incorrect 0 ms 348 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Incorrect 0 ms 348 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 652 ms 66396 KB Output is correct
2 Correct 1297 ms 75700 KB Output is correct
3 Correct 284 ms 61468 KB Output is correct
4 Correct 534 ms 68988 KB Output is correct
5 Correct 1567 ms 75772 KB Output is correct
6 Correct 1546 ms 74924 KB Output is correct
7 Correct 212 ms 63704 KB Output is correct
8 Correct 499 ms 66996 KB Output is correct
9 Correct 549 ms 69636 KB Output is correct
10 Correct 564 ms 77052 KB Output is correct
11 Correct 500 ms 74788 KB Output is correct
12 Correct 582 ms 79720 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 868 ms 75924 KB Output is correct
2 Correct 321 ms 39088 KB Output is correct
3 Correct 1436 ms 77144 KB Output is correct
4 Correct 256 ms 64596 KB Output is correct
5 Correct 592 ms 66008 KB Output is correct
6 Correct 526 ms 67784 KB Output is correct
7 Correct 1720 ms 76328 KB Output is correct
8 Correct 1631 ms 75952 KB Output is correct
9 Correct 218 ms 62648 KB Output is correct
10 Correct 549 ms 70064 KB Output is correct
11 Correct 714 ms 74164 KB Output is correct
12 Correct 829 ms 80556 KB Output is correct
13 Correct 537 ms 75096 KB Output is correct
14 Correct 604 ms 73380 KB Output is correct
15 Correct 586 ms 74584 KB Output is correct
16 Correct 613 ms 77232 KB Output is correct
17 Correct 640 ms 74672 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Incorrect 0 ms 348 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Incorrect 0 ms 348 KB Output isn't correct
5 Halted 0 ms 0 KB -