답안 #68647

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
68647 2018-08-17T18:54:10 Z KLPP 무지개나라 (APIO17_rainbow) C++14
11 / 100
554 ms 164964 KB
#include "rainbow.h"
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef pair<int,int> pii;
bool table[500][500];
int r,c;
int CC[2000000][2];
int STm[2000000][32][2];
int STM[2000000][32][2];
void init(int R, int C, int sr, int sc, int M, char *S) {
	
	r=R;
	c=C;
	for(int i=0;i<r;i++){
		for(int j=0;j<c;j++)table[i][j]=1;
	}
	int x,y;
	x=sr-1;
	y=sc-1;
	table[x][y]=0;
	for(int i=0;i<M;i++){
		char c=S[i];
		if(c=='N')x--;
		if(c=='S')x++;
		if(c=='E')y++;
		if(c=='W')y--;
		table[x][y]=0;
	}
	/*for(int i=0;i<r;i++){
		for(int j=0;j<c;j++)cout<<table[i][j];
		cout<<endl;
	}*/
	if(r==2){
		int n=c;
		int color=0;	
		for(int i=0;i<n;i++){
			if(table[0][i]){//cout<<i<<endl;
				if(i>0 && table[0][i-1])CC[i][0]=CC[i-1][0];
				else CC[i][0]=color++;
			}else CC[i][0]=-1;
			//cout<<CC[i][0]<<" ";
		}//cout<<endl;
		for(int i=0;i<n;i++){
			if(table[1][i]){
				if(i>0 && table[1][i-1])CC[i][1]=CC[i-1][1];
				else CC[i][1]=color++;
			}else CC[i][1]=-1;
			//cout<<CC[i][1]<<" ";
		}//cout<<endl;
		for(int i=0;i<n;i++){
			STM[i][0][0]=CC[i][0];
			STM[i][0][1]=CC[i][1];
		}
		for(int j=1;j<32;j++){for(int i=0;i<n;i++){
			STM[i][j][0]=max(STM[i][j-1][0],STM[min(n-1,i+(1<<(j-1)))][j-1][0]);
			STM[i][j][1]=max(STM[i][j-1][1],STM[min(n-1,i+(1<<(j-1)))][j-1][1]);
			}
		}
		for(int i=0;i<n;i++){
			STm[i][0][0]=CC[i][0];
			STm[i][0][1]=CC[i][1];
			if(CC[i][0]==-1)STm[i][0][0]=n+1;
			if(CC[i][1]==-1)STm[i][0][1]=n+1;
		}
		for(int j=1;j<32;j++){
			for(int i=0;i<n;i++){
			STm[i][j][0]=min(STm[i][j-1][0],STm[min(n-1,i+(1<<(j-1)))][j-1][0]);
			STm[i][j][1]=min(STm[i][j-1][1],STm[min(n-1,i+(1<<(j-1)))][j-1][1]);
			}
		}
	}
}

int colour(int ar, int ac, int br, int bc){
	ar--;
	ac--;
	br--;
	bc--;
	if(r!=2){
	bool visited[r][c];
	for(int x=ar;x<=br;x++){
		for(int y=ac;y<=bc;y++){
			visited[x][y]=false;
		}
	}
	int CC=0;
	for(int x=ar;x<=br;x++){
		for(int y=ac;y<=bc;y++){
			if(!visited[x][y] && table[x][y]){
			queue<pii>q;
			q.push(pii(x,y));
			while(!q.empty()){
				pii p=q.front();q.pop();
				if(ar<=p.first && p.first<=br && ac<=p.second && p.second<=bc && !visited[p.first][p.second] && table[p.first][p.second]){
					visited[p.first][p.second]=true;
					q.push(pii(p.first-1,p.second));
					q.push(pii(p.first+1,p.second));
					q.push(pii(p.first,p.second+1));
					q.push(pii(p.first,p.second-1));
				}
			}
			CC++;
			}
		}
	}
	return CC;
	}
	int pow=30;
	while((1<<pow)>bc-ac+1){
		pow--;
	}
	if(ar==br){
		int maximo=max(STM[ac][pow][ar],STM[bc-(1<<pow)+1][pow][ar]);
		int minimo=min(STm[ac][pow][ar],STm[bc-(1<<pow)+1][pow][ar]);
		//cout<<maximo<<" "<<minimo<<" "<<pow<<endl;
		if(maximo==-1)return 0;
		return maximo-minimo+1;
	}
	int CC=0;
	for(int a=ar;a<=br;a++){
		int maximo=max(STM[ac][pow][a],STM[bc-(1<<pow)+1][pow][a]);
		int minimo=min(STm[ac][pow][a],STm[bc-(1<<pow)+1][pow][a]);
		//cout<<maximo<<" "<<minimo<<endl;
		if(maximo>=0)CC+=maximo-minimo+1;
	}//cout<<CC<<endl;
	if(table[ac][0] && table[ac][1])CC--;
	if(bc!=ac && table[bc][0] && table[bc][1] && CC>1)CC--;
	return CC;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 248 KB Output is correct
2 Correct 17 ms 504 KB Output is correct
3 Correct 48 ms 576 KB Output is correct
4 Correct 48 ms 576 KB Output is correct
5 Correct 15 ms 592 KB Output is correct
6 Correct 3 ms 592 KB Output is correct
7 Correct 3 ms 592 KB Output is correct
8 Correct 3 ms 644 KB Output is correct
9 Correct 2 ms 644 KB Output is correct
10 Correct 3 ms 644 KB Output is correct
11 Correct 35 ms 668 KB Output is correct
12 Correct 32 ms 668 KB Output is correct
13 Correct 24 ms 668 KB Output is correct
14 Correct 35 ms 796 KB Output is correct
15 Correct 2 ms 796 KB Output is correct
16 Correct 2 ms 796 KB Output is correct
17 Correct 2 ms 796 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 796 KB Output is correct
2 Correct 2 ms 796 KB Output is correct
3 Runtime error 554 ms 164964 KB Execution killed with signal 11 (could be triggered by violating memory limits)
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 796 KB Output is correct
2 Runtime error 105 ms 164964 KB Execution killed with signal 11 (could be triggered by violating memory limits)
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 248 KB Output is correct
2 Correct 17 ms 504 KB Output is correct
3 Correct 48 ms 576 KB Output is correct
4 Correct 48 ms 576 KB Output is correct
5 Correct 15 ms 592 KB Output is correct
6 Correct 3 ms 592 KB Output is correct
7 Correct 3 ms 592 KB Output is correct
8 Correct 3 ms 644 KB Output is correct
9 Correct 2 ms 644 KB Output is correct
10 Correct 3 ms 644 KB Output is correct
11 Correct 35 ms 668 KB Output is correct
12 Correct 32 ms 668 KB Output is correct
13 Correct 24 ms 668 KB Output is correct
14 Correct 35 ms 796 KB Output is correct
15 Correct 2 ms 796 KB Output is correct
16 Correct 2 ms 796 KB Output is correct
17 Correct 2 ms 796 KB Output is correct
18 Runtime error 40 ms 164964 KB Execution killed with signal 11 (could be triggered by violating memory limits)
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 248 KB Output is correct
2 Correct 17 ms 504 KB Output is correct
3 Correct 48 ms 576 KB Output is correct
4 Correct 48 ms 576 KB Output is correct
5 Correct 15 ms 592 KB Output is correct
6 Correct 3 ms 592 KB Output is correct
7 Correct 3 ms 592 KB Output is correct
8 Correct 3 ms 644 KB Output is correct
9 Correct 2 ms 644 KB Output is correct
10 Correct 3 ms 644 KB Output is correct
11 Correct 35 ms 668 KB Output is correct
12 Correct 32 ms 668 KB Output is correct
13 Correct 24 ms 668 KB Output is correct
14 Correct 35 ms 796 KB Output is correct
15 Correct 2 ms 796 KB Output is correct
16 Correct 2 ms 796 KB Output is correct
17 Correct 2 ms 796 KB Output is correct
18 Runtime error 40 ms 164964 KB Execution killed with signal 11 (could be triggered by violating memory limits)
19 Halted 0 ms 0 KB -