Submission #578568

#TimeUsernameProblemLanguageResultExecution timeMemory
578568jiahngLand of the Rainbow Gold (APIO17_rainbow)C++14
100 / 100
1697 ms622540 KiB
#include "rainbow.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; // #define ll int //#define int ll typedef pair<int32_t, int32_t> pi; typedef vector <int> vi; typedef vector <pi> vpi; typedef pair<pi, ll> pii; typedef set <ll> si; typedef long double ld; #define f first #define s second #define mp make_pair #define FOR(i,s,e) for(int i=s;i<=int(e);++i) #define DEC(i,s,e) for(int i=s;i>=int(e);--i) #define pb push_back #define all(x) (x).begin(), (x).end() #define lbd(x, y) lower_bound(all(x), y) #define ubd(x, y) upper_bound(all(x), y) #define aFOR(i,x) for (auto i: x) #define mem(x,i) memset(x,i,sizeof x) #define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define maxn 120001 #define INF 1e9 #define MOD 1000000007 typedef pair <vi, int> pvi; typedef pair <int,pi> ipi; typedef vector <pii> vpii; int R,C; struct node{ int s,e,m; int val = 0; node *l,*r; node(int ss,int ee){ s = ss; e = ee; m = (s + e) / 2; } void init(){ if (s != e){ l = new node(s,m); r = new node(m+1,e); l->init(); r->init(); } } void upd(int p,int v, node *ref){ val += v; if (s == e) return; else if (p > m){ l = ref->l; r = new node(m+1,e); r->val = ref->r->val; r->upd(p,v,ref->r); }else{ r = ref->r; l = new node(s,m); l->val = ref->l->val; l->upd(p,v,ref->l); } } int qry(int a,int b){ if (a <= s && e <= b) return val; else if (a > e || s > b) return 0; return l->qry(a,b) + r->qry(a,b); } }; struct seg2D{ vector <node*> roots; seg2D(int N,int M,vpi &v){ node *root = new node(1,M); root->init(); roots.pb(root); sort(all(v)); v.erase(unique(all(v)),v.end()); int ptr = 0; FOR(i,1,N){ while(ptr < v.size() && v[ptr].f == i){ node *newroot = new node(1,M); newroot->val = root->val; newroot->upd(v[ptr].s,1,root); ptr++; root = newroot; } roots.pb(root); } } int qry(int a,int b,int c,int d){ return roots[b]->qry(c,d) - roots[a-1]->qry(c,d); } }*lakeseg, *horseg, *vertseg, *cornerseg; set <pi> st; void init(int R, int C, int sr, int sc, int M, char *S) { int x=sr,y=sc; vpi lake,hor,vert,corner; lake.pb(pi(x,y)); FOR(dx,0,1) FOR(dy,0,1) corner.pb(pi(x+dx,y+dy)); hor.pb(pi(x,y)); hor.pb(pi(x+1,y)); vert.pb(pi(x,y)); vert.pb(pi(x, y+1)); FOR(i,0,M-1){ if (S[i] == 'S') x++; else if (S[i] == 'N') x--; else if (S[i] == 'E') y++; else if (S[i] == 'W') y--; lake.pb(pi(x,y)); FOR(dx,0,1) FOR(dy,0,1) corner.pb(pi(x+dx,y+dy)); hor.pb(pi(x,y)); hor.pb(pi(x+1,y)); vert.pb(pi(x,y)); vert.pb(pi(x, y+1)); } lakeseg = new seg2D(R+1,C+1,lake); //cout << lakeseg->qry(2,3,2,3); //cout.flush(); cornerseg = new seg2D(R+1,C+1,corner); horseg = new seg2D(R+1,C+1,hor); vertseg = new seg2D(R+1,C+1,vert); } int colour(int ar, int ac, int br, int bc) { int edges = horseg->qry(ar+1,br,ac,bc) + vertseg->qry(ar,br,ac+1,bc) + 2 * (br - ar + 1 + bc - ac + 1); int vertices = cornerseg->qry(ar+1,br,ac+1,bc) + 2 * (br - ar + 2 + bc - ac + 2) - 4; int touch = lakeseg->qry(ar,ar,ac,bc) + lakeseg->qry(br,br,ac,bc); touch += lakeseg->qry(ar,br,ac,ac) + lakeseg->qry(ar,br,bc,bc); int numlake = lakeseg->qry(ar,br,ac,bc); //cout << horseg->qry(ar,br,ac+1,bc) << ' ' << vertseg->qry(ar+1,br,ac,bc) << ' ' << 2 * (br - ar + 1 + bc - ac + 1) << ' ' << edges << ' ' << vertices << '\n'; return edges - vertices + 1 - numlake + (!touch && numlake); }

Compilation message (stderr)

rainbow.cpp: In constructor 'seg2D::seg2D(int, int, vpi&)':
rainbow.cpp:72:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |            while(ptr < v.size() && v[ptr].f == i){
      |                  ~~~~^~~~~~~~~~
#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...