Submission #524214

#TimeUsernameProblemLanguageResultExecution timeMemory
524214sidonLand of the Rainbow Gold (APIO17_rainbow)C++17
100 / 100
921 ms112564 KiB
#include <bits/stdc++.h> using namespace std; #define all(X) begin(X), end(X) const int Z = 2e5+4; template<const int n> struct SegmentTree { vector<int> a[2*n]; void insert(int i, int v) { a[i+n].push_back(v); } void build() { for(int i = n; i < 2*n; ++i) { sort(all(a[i])); a[i].erase(unique(all(a[i])), end(a[i])); } for(int i = n; --i; ) merge(all(a[2*i]), all(a[2*i+1]), back_inserter(a[i])); } int getCnt(int i, int lv, int rv) { return upper_bound(all(a[i]), rv) - lower_bound(all(a[i]), lv); } int count(int l, int r, int lv, int rv) { int x = 0; for(l += n, r += n+1; l < r; l /= 2, r /= 2) { if(l & 1) x += getCnt(l++, lv, rv); if(r & 1) x += getCnt(--r, lv, rv); } return x; } }; SegmentTree<2*Z> edges; SegmentTree<Z> cells, vertices; int minR = Z, minC = Z, maxR, maxC; void init(int R, int C, int uR, int uC, int M, char* S) { for(int i = 0; i <= M; ++i) { cells.insert(uC, uR); minR = min(minR, uR); minC = min(minC, uC); maxR = max(maxR, uR); maxC = max(maxC, uC); for(int x : {0, 1}) for(int y : {0, 1}) { vertices.insert(uC+x, uR+y); } for(int x : {0, 2}) { edges.insert(2*uC+x, 2*uR+1); edges.insert(2*uC+1, 2*uR+x); } if(i < M) { S[i] == 'S' ? ++uR : 0; S[i] == 'N' ? --uR : 0; S[i] == 'E' ? ++uC : 0; S[i] == 'W' ? --uC : 0; } } edges.build(); cells.build(); vertices.build(); } int colour(int ar, int ac, int br, int bc) { bool add = ar < minR && ac < minC && br > maxR && bc > maxC; return edges.count(2*ac+1, 2*bc+1, 2*ar+1, 2*br+1) - vertices.count(ac+1, bc, ar+1, br) - cells.count(ac, bc, ar, br) + 1 + add; }
#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...