제출 #184027

#제출 시각아이디문제언어결과실행 시간메모리
184027oolimry무지개나라 (APIO17_rainbow)C++14
100 / 100
1184 ms99176 KiB
#include "rainbow.h"
#include <bits/stdc++.h>
using namespace std;
const int N = 200002; int totalRivers;
struct segment{
	vector<int> tree[2*N+5];
	inline void update(int i, int v){ tree[i+N].push_back(v); }
	inline void getReady(){
		for(int i = N;i < 2*N;i++){
			sort(tree[i].begin(),tree[i].end());
			tree[i].erase(unique(tree[i].begin(),tree[i].end()),tree[i].end());
		}
		for(int i = N-1;i > 0;i--){ ///basically merge sort
			tree[i] = vector<int>(tree[i<<1].size()+tree[i<<1|1].size());
			merge(tree[i<<1].begin(),tree[i<<1].end(), tree[i<<1|1].begin(),tree[i<<1|1].end(),tree[i].begin());
		}
	}
	inline int query(int l, int r, int x, int y){ 
		int ans = 0;
		for(l += N, r += (N+1);l < r;l >>= 1, r >>= 1){
			if(l&1) ans += upper_bound(tree[l].begin(),tree[l].end(),y) - lower_bound(tree[l].begin(),tree[l].end(),x), l++;
			if(r&1) r--, ans += upper_bound(tree[r].begin(),tree[r].end(),y) - lower_bound(tree[r].begin(),tree[r].end(),x);
		}
		return ans;
	}
} vertices, horizontal, vertical, faces;
void addRiver(int r, int c){
	vertices.update(r,c);
	horizontal.update(r,c-1); horizontal.update(r,c);
	vertical.update(c,r-1); vertical.update(c,r);
	faces.update(r-1,c-1); faces.update(r,c-1); faces.update(r-1,c); faces.update(r,c);
}
void init(int R, int C, int sr, int sc, int M, char *S) {
	addRiver(sr,sc);
	for(int i = 0;i < M;i++){
		if(S[i] == 'N') sr--; else if(S[i] == 'S') sr++; else if(S[i] == 'E') sc++; else sc--;
		addRiver(sr,sc);
	}
	vertices.getReady(); horizontal.getReady(); vertical.getReady(); faces.getReady();
	totalRivers = vertices.query(0,N-1,0,N-1);
}
int colour(int T, int L, int B, int R) {
	long long H = B - T + 1, W = R - L + 1;
	long long V = H * W - vertices.query(T,B,L,R);
	long long E = (H-1)*W + (W-1)*H - horizontal.query(T,B,L,R-1) - vertical.query(L,R,T,B-1);
	long long F = (H-1)*(W-1) - faces.query(T,B-1,L,R-1);
	if(vertices.query(T+1,B-1,L+1,R-1) == totalRivers) F++;
	return V - E + F;
}
#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...