이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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[200000][2];
int STm[200000][32][2];
int STM[200000][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[0][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]);
if(maximo>=0)CC+=maximo-minimo+1;
}
return CC;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |