제출 #851172

#제출 시각아이디문제언어결과실행 시간메모리
851172jerzyk자리 배치 (IOI18_seats)C++17
0 / 100
335 ms52560 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #include "seats.h" #define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> using namespace __gnu_pbds; using namespace std; #define pb push_back #define st first #define nd second typedef long long ll; typedef long double ld; const ll I = 1000LL * 1000LL * 1000LL * 1000LL * 1000LL * 1000LL; const ll M = 1000LL * 1000LL * 1000LL + 7LL; const int N = 1<<20; int n, val = 2, m, nm; int tab[N], drz[2 * N], il[2 * N], laz[2 * N]; void Push(int v) { drz[v * 2] += laz[v]; laz[v * 2] += laz[v]; drz[v * 2 + 1] += laz[v]; laz[v * 2 + 1] += laz[v]; laz[v] = 0; } void Change(int v, int p, int k, int pz, int kz, int x) { if(p > kz || k < pz) return; if(p >= pz && k <= kz) { drz[v] += x; laz[v] += x; return; } int m = (p + k) / 2; Change(v * 2, p, m, pz, kz, x); Change(v * 2 + 1, m + 1, k, pz, kz, x); drz[v] = min(drz[v * 2], drz[v * 2 + 1]); il[v] = 0; if(drz[v] == drz[v * 2]) il[v] += il[v * 2]; if(drz[v] == drz[v * 2 + 1]) il[v] += il[v * 2 + 1]; drz[v] += laz[v]; } inline void CH(int a, int b, int x) {Change(1, 0, N - 1, a, b, x);} inline void HN(int a, int b, int x) { if(b < a) swap(a, b); CH(a, b - 1, x); } inline void U(int v, int x) { HN(tab[v - 1], tab[v], x); HN(tab[v], tab[v + 1], x); } void Query(int a, int b) { U(a, -1); U(b, -1); swap(tab[a], tab[b]); U(a, 1); U(b, 1); } int Ans() { int ans = 0; if(drz[1] == val) ans += il[1]; return ans; } void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C) { n = H; m = W; nm = n * m; for(int i = N; i < 2 * N; ++i) il[i] = 1; drz[N] = N; for(int i = N + nm + 1; i < 2 * N; ++i) drz[i] = N; for(int v = N - 1; v > 0; --v) { drz[v] = min(drz[v * 2], drz[v * 2 + 1]); if(drz[v] == drz[v * 2]) il[v] += il[v * 2]; if(drz[v] == drz[v * 2 + 1]) il[v] += il[v * 2 + 1]; } for(int i = 1; i <= m; ++i) tab[C[i - 1] + 1] = i; tab[0] = nm + 10; tab[m + 1] = nm + 10; for(int i = 1; i <= m + 1; ++i) HN(tab[i], tab[i - 1], 1); //cout << "XD " << drz[1] << " " << Ans() << "\n"; } int swap_seats(int a, int b) { Query(a + 1, b + 1); return Ans(); }
#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...