Submission #433497

#TimeUsernameProblemLanguageResultExecution timeMemory
433497rqiLand of the Rainbow Gold (APIO17_rainbow)C++14
35 / 100
3071 ms32004 KiB
#include "rainbow.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pi; typedef vector<int> vi; typedef vector<pi> vpi; #define mp make_pair #define f first #define s second #define ins insert #define pb push_back void ckmin(int& a, int b){ a = min(a, b); } void ckmax(int& a, int b){ a = max(a, b); } vector<char> dchar = vector<char>{'S', 'E', 'N', 'W'}; vi dx = vi{1, 0, -1, 0}; vi dy = vi{0, 1, 0, -1}; #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; struct hashFunc{ size_t operator()(pi a) const { ll res = ll(a.f)*200005+ll(a.s); ll BIG_RAND = 102923014203249LL; return __builtin_bswap64((unsigned long long)(res)*BIG_RAND); } }; struct Off2DBIT{ vpi all_updates; void update(int X, int Y){ all_updates.pb(mp(X, Y)); } ll query(int xl, int yl, int xr, int yr){ ll res = 0; for(auto& u: all_updates){ if(xl <= u.f && u.f <= xr && yl <= u.s && u.s <= yr){ res++; } } return res; } }; Off2DBIT bits[2][2]; gp_hash_table<pi, null_type, hashFunc> rects[4]; int min_sr, max_sr, min_sc, max_sc; void init(int R, int C, int sr, int sc, int M, char *S) { min_sr = sr; min_sc = sc; max_sr = sr; max_sc = sc; for(int i = 0; i <= M; i++){ for(int i = 0; i <= 1; i++){ for(int j = 0; j <= 1; j++){ for(int xl = sr-i; xl <= sr; xl++){ for(int yl = sc-j; yl <= sc; yl++){ if(1 <= xl && 1 <= yl){ rects[2*i+j][mp(xl, yl)]; } } } } } if(i < M){ for(int d = 0; d < 4; d++){ if(S[i] == dchar[d]){ sr+=dx[d]; sc+=dy[d]; break; } } } ckmin(min_sr, sr); ckmin(min_sc, sc); ckmax(max_sr, sr); ckmax(max_sc, sc); } for(int i = 0; i <= 1; i++){ for(int j = 0; j <= 1; j++){ // cout << "i, j = " << i << ", " << j << "\n"; for(auto u: rects[2*i+j]){ // cout << "RECT " << i << " " << j << " " << u.f << " " << u.s << "\n"; bits[i][j].update(u.f, u.s); } } } } int colour(int ar, int ac, int br, int bc) { ll ans = 0; if(ar+1 <= min_sr && max_sr+1 <= br && ac+1 <= min_sc && max_sc+1 <= bc){ ans++; } for(int i = 0; i <= 1; i++){ for(int j = 0; j <= 1; j++){ ll val = ll(br-i-ar+1)*ll(bc-j-ac+1); // cout << "val: " << val << "\n"; val-=bits[i][j].query(ar, ac, br-i, bc-j); if((i+j) % 2 == 0){ ans+=val; } else{ ans-=val; } // cout << i << " " << j << " " << val << "\n"; } } return (int)(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...