Submission #520427

#TimeUsernameProblemLanguageResultExecution timeMemory
520427pokmui9909허수아비 (JOI14_scarecrows)C++17
100 / 100
2460 ms33212 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define x first #define y second const ll S = (1 << 19); const ll INF = 1e15; struct MaxSegTree{ ll T[2 * S] = {}; void update(ll k, ll v) { update(1, 1, S, k + 1, v); } ll query(ll l, ll r) { return query(1, 1, S, l + 1, r + 1); } void update(ll node, ll s, ll e, ll k, ll v){ if (s == e){ T[node] = v; return; } ll m = (s + e) / 2; ll lch = 2 * node, rch = 2 * node + 1; if (k <= m) update(lch, s, m, k, v); else update(rch, m + 1, e, k, v); ll x = T[lch], y = T[rch]; T[node] = max(x, y); } ll query(ll node, ll s, ll e, ll l, ll r){ if (e < l || s > r) return -INF; if (l <= s && e <= r) return T[node]; ll m = (s + e) / 2; ll lch = 2 * node, rch = 2 * node + 1; ll x = query(lch, s, m, l, r), y = query(rch, m + 1, e, l, r); return max(x, y); } }; MaxSegTree T1, T2; ll N; pair<ll, ll> A[200005]; ll ans = 0; void dnc(ll L, ll R){ if(L >= R) return; ll m = (L + R) / 2; dnc(L, m); dnc(m + 1, R); vector<pair<ll, ll>> V; for(int i = L; i <= R; i++){ V.push_back({A[i].y, i}); } sort(V.begin(), V.end(), greater<pair<ll, ll>>()); vector<ll> B; for(int i = 0; i < V.size(); i++){ ll K = V[i].y; if(K <= m){ ll S = T1.query(K, m); if(S == -INF) S = 0; ll E = -T2.query(S, i); ll idx = lower_bound(B.begin(), B.end(), E) - B.begin(); ans += B.size() - idx; T1.update(K, i); } else { while(!B.empty() && B.back() > K) B.pop_back(); B.push_back(K); T2.update(i, -K); } } for(int i = 0; i < V.size(); i++){ ll K = V[i].y; T1.update(K, -INF); T2.update(K, -INF); T1.update(i, -INF); T2.update(i, -INF); } } int main(){ cin.tie(0) -> sync_with_stdio(false); for(int i = 1; i <= S; i++){ T1.update(i, -INF); T2.update(i, -INF); } cin >> N; vector<ll> X, Y; for(int i = 1; i <= N; i++){ cin >> A[i].x >> A[i].y; X.push_back(A[i].x); Y.push_back(A[i].y); } sort(X.begin(), X.end()); sort(Y.begin(), Y.end()); sort(A + 1, A + N + 1); for(int i = 1; i <= N; i++){ A[i].x = lower_bound(X.begin(), X.end(), A[i].x) - X.begin() + 1; A[i].y = lower_bound(Y.begin(), Y.end(), A[i].y) - Y.begin() + 1; } dnc(1, N); cout << ans; }

Compilation message (stderr)

scarecrows.cpp: In function 'void dnc(ll, ll)':
scarecrows.cpp:50:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |     for(int i = 0; i < V.size(); i++){
      |                    ~~^~~~~~~~~~
scarecrows.cpp:65:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   65 |     for(int i = 0; i < V.size(); i++){
      |                    ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...