Submission #1266360

#TimeUsernameProblemLanguageResultExecution timeMemory
1266360PlayVoltzLand of the Rainbow Gold (APIO17_rainbow)C++20
100 / 100
1351 ms247188 KiB
#include "rainbow.h"
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define pb push_back

struct node{
	int s, e, m;
	vector<int> val;
	node *l, *r;
	
	node(int S, int E){
		s = S, e = E, m = (s+e)/2;
		if (s!=e){
			l = new node(s, m);
			r = new node(m+1, e);
		}
	}
	void up(int ind, int nv){
		if (s==e)val.pb(nv);
		else{
			if (ind<=m)l->up(ind, nv);
			else r->up(ind, nv);
		}
	}
	void init(){
		if (s!=e)l->init(), r->init(), merge(l->val.begin(), l->val.end(), r->val.begin(), r->val.end(), back_inserter(val));
		else{
			sort(val.begin(), val.end());
			val.erase(unique(val.begin(), val.end()), val.end());
		}
	}
	int query(int a, int x, int b, int y){
		if (a>b||x>y)return 0;
		if (s==a && e==b){
			return upper_bound(val.begin(), val.end(), y)-lower_bound(val.begin(), val.end(), x);
		}
		if (b<=m)return l->query(a, x, b, y);
		else if (a>m)return r->query(a, x, b, y);
		return l->query(a, x, m, y)+r->query(m+1, x, b, y);
	}
}*black, *hori, *vert, *dot;

void add(int x, int y){
	black->up(x, y);
	hori->up(x, y);
	hori->up(x+1, y);
	vert->up(x, y);
	vert->up(x, y+1);
	dot->up(x, y);
	dot->up(x+1, y);
	dot->up(x, y+1);
	dot->up(x+1, y+1);
}

int ccc=0;

void init(signed r, signed c, signed x, signed y, signed m, char *s){
	black = new node(1, r+1);
	hori = new node(1, r+1);
	vert = new node(1, r+1);
	dot = new node(1, r+1);
	add(x, y);
	for (int i=0; i<m; ++i){
		if (s[i]=='N')--x;
		else if (s[i]=='S')++x;
		else if (s[i]=='W')--y;
		else ++y;
		add(x, y);
	}
	black->init(), hori->init(), vert->init(), dot->init();
	ccc=black->query(1, 1, r+1, c+1);
}

signed colour(signed a, signed b, signed x, signed y){
	int e=2*(y-b+1)+2*(x-a+1)+hori->query(a+1, b, x, y)+vert->query(a, b+1, x, y);
	int v=dot->query(a+1, b+1, x, y)+2*(x-a+2)+2*(y-b);
	return (black->query(a+1, b+1, x-1, y-1)==ccc?2:1)-v+e-black->query(a, b, x, y);
}
#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...