Submission #729733

#TimeUsernameProblemLanguageResultExecution timeMemory
729733t6twotwoSeats (IOI18_seats)C++17
0 / 100
4072 ms56632 KiB
#include "seats.h" #include <bits/stdc++.h> using namespace std; template <typename T> struct segment_tree { int n; vector<T> s; T e; function<T(T, T)> f; segment_tree() { } segment_tree(int _n, T _e, function<T(T, T)> _f) : f(_f), e(_e) { n = 2 << __lg(_n); s.assign(2 * n - 1, e); } segment_tree(vector<T> &a, T _e, function<T(T, T)> _f) : segment_tree(a.size(), _e, _f) { for (int i = 0; i < a.size(); i++) { s[i + n - 1] = a[i]; } for (int i = n - 2; i >= 0; i--) { s[i] = f(s[i * 2 + 1], s[i * 2 + 2]); } } void modify(int p, int l, int r, int x, const T v) { if (l + 1 == r) { s[p] = v; return; } int m = (l + r + 1) / 2; if (x < m) { modify(p * 2 + 1, l, m, x, v); } else { modify(p * 2 + 2, m, r, x, v); } s[p] = f(s[p * 2 + 1], s[p * 2 + 2]); } void modify(int x, const T v) { modify(0, 0, n, x, v); } T range_query(int p, int l, int r, int L, int R) { if (R <= l || r <= L) { return e; } if (L <= l && r <= R) { return s[p]; } int m = (l + r + 1) / 2; return f(range_query(p * 2 + 1, l, m, L, R), range_query(p * 2 + 2, m, r, L, R)); } T range_query(int l, int r) { return range_query(0, 0, n, l, r); } }; int N, M; vector<int> A, B; segment_tree<int> SL, SR, SU, SD; void give_initial_chart(int H, int W, vector<int> R, vector<int> C) { N = H, M = W; A = R, B = C; SU = segment_tree<int>(A, N, [&](int x, int y) {return min(x, y);}); SL = segment_tree<int>(B, M, [&](int x, int y) {return min(x, y);}); SD = segment_tree<int>(A,-1, [&](int x, int y) {return max(x, y);}); SR = segment_tree<int>(A,-1, [&](int x, int y) {return max(x, y);}); } int swap_seats(int u, int v) { swap(A[u], A[v]); swap(B[u], B[v]); SU.modify(u, A[u]); SU.modify(v, A[v]); SD.modify(u, A[u]); SD.modify(v, A[v]); SL.modify(u, B[u]); SL.modify(v, B[v]); SR.modify(u, B[u]); SR.modify(v, B[v]); int ans = 0; int U = A[0], D = A[0], L = B[0], R = B[0]; for (int i = 1; i <= N * M;) { int s = (R - L + 1) * (D - U + 1); if (s == i) { ans++; } if (i == N * M) { break; } if (s == i) { U = min(U, A[i]); D = max(D, A[i]); L = min(L, B[i]); R = max(R, B[i]); i++; } else { U = SU.range_query(0, s); D = SD.range_query(0, s); L = SL.range_query(0, s); R = SR.range_query(0, s); i = s; } } return ans; }

Compilation message (stderr)

seats.cpp: In instantiation of 'segment_tree<T>::segment_tree(std::vector<_Tp>&, T, std::function<T(T, T)>) [with T = int]':
seats.cpp:60:71:   required from here
seats.cpp:17:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 |         for (int i = 0; i < a.size(); i++) {
      |                         ~~^~~~~~~~~~
seats.cpp: In instantiation of 'segment_tree<T>::segment_tree(int, T, std::function<T(T, T)>) [with T = int]':
seats.cpp:16:91:   required from 'segment_tree<T>::segment_tree(std::vector<_Tp>&, T, std::function<T(T, T)>) [with T = int]'
seats.cpp:60:71:   required from here
seats.cpp:9:23: warning: 'segment_tree<int>::f' will be initialized after [-Wreorder]
    9 |     function<T(T, T)> f;
      |                       ^
seats.cpp:8:7: warning:   'int segment_tree<int>::e' [-Wreorder]
    8 |     T e;
      |       ^
seats.cpp:12:5: warning:   when initialized here [-Wreorder]
   12 |     segment_tree(int _n, T _e, function<T(T, T)> _f) : f(_f), e(_e) {
      |     ^~~~~~~~~~~~
#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...