Submission #222557

#TimeUsernameProblemLanguageResultExecution timeMemory
222557compilers문명 (KOI17_civilization)C++14
100 / 100
816 ms29224 KiB
#include <iostream> #include <queue> using namespace std; #define MAX_SIZE (2000+1) #define MAX_CIVILIZATION (100000+1) #define NONE 0 #define UP 0 #define DOWN 1 #define LEFT 2 #define RIGHT 3 #define MAX_DIR 4 const struct{ int d_row,d_col; } adj[MAX_DIR] = {{-1,0},{1,0},{0,-1},{0,1}}; #define IN_RANGE(MIN,n,MAX) ((MIN)<=(n)&&(n)<=(MAX)) typedef pair<int,int> Pos; // first:row, second:col int N,K,grid[MAX_SIZE][MAX_SIZE]; int parent[MAX_CIVILIZATION]; int find_parent_civilization(int c) { int& ret = parent[c]; if( ret != c ) { ret = find_parent_civilization(ret); } return ret; } int simulate(queue<Pos>& pos_q) { int t; for(t=0;K!=1;t++) { queue<Pos> spread; for(int i=1,size=pos_q.size();i<=size;i++) { int current_row,current_col; current_row = pos_q.front().first; current_col = pos_q.front().second; pos_q.pop(); for(int d=UP;d<=RIGHT;d++) { int adj_row,adj_col; int current_civilization,adj_civilization; adj_row = current_row+adj[d].d_row; adj_col = current_col+adj[d].d_col; if( !IN_RANGE(1,adj_row,N) || !IN_RANGE(1,adj_col,N) ) { continue; } current_civilization = find_parent_civilization(grid[current_row][current_col]); if( grid[adj_row][adj_col] == NONE ) { grid[adj_row][adj_col] = current_civilization; spread.push(make_pair(adj_row,adj_col)); pos_q.push(make_pair(adj_row,adj_col)); } } } for(;!spread.empty();) { int current_row,current_col; current_row = spread.front().first; current_col = spread.front().second; spread.pop(); for(int d=UP;d<=RIGHT;d++) { int adj_row,adj_col; int current_civilization,adj_civilization; adj_row = current_row+adj[d].d_row; adj_col = current_col+adj[d].d_col; if( !IN_RANGE(1,adj_row,N) || !IN_RANGE(1,adj_col,N) || grid[adj_row][adj_col]==NONE ) { continue; } current_civilization = find_parent_civilization(grid[current_row][current_col]); adj_civilization = find_parent_civilization(grid[adj_row][adj_col]); if( current_civilization == adj_civilization ) { continue; } int big,small; big = max(current_civilization,adj_civilization); small = min(current_civilization,adj_civilization); parent[big] = small; K--; } } /* cout<<"time="<<t+1<<",K="<<K<<'\n'; for(int row=1;row<=N;row++) { for(int col=1;col<=N;col++) { cout<<find_parent(grid[row][col])<<' '; } cout<<'\n'; } getchar(); */ } return t; } void input(queue<Pos>& pos_q) { cin>>N>>K; for(int i=1;i<=K;i++) { int row,col; cin>>col>>row; pos_q.push(make_pair(row,col)); grid[row][col] = parent[i] = i; } for(int i=1,size=pos_q.size();i<=size;i++) { int current_row,current_col; current_row = pos_q.front().first; current_col = pos_q.front().second; pos_q.pop(); pos_q.push(make_pair(current_row,current_col)); for(int d=UP;d<=RIGHT;d++) { int adj_row,adj_col; int current_civilization,adj_civilization; adj_row = current_row+adj[d].d_row; adj_col = current_col+adj[d].d_col; if( !IN_RANGE(1,adj_row,N) || !IN_RANGE(1,adj_col,N) || grid[adj_row][adj_col]==NONE ) { continue; } current_civilization = find_parent_civilization(grid[current_row][current_col]); adj_civilization = find_parent_civilization(grid[adj_row][adj_col]); if( current_civilization != adj_civilization ) { int big,small; big = max(current_civilization,adj_civilization); small = min(current_civilization,adj_civilization); parent[big] = small; K--; } } } } int main(void) { cin.tie(NULL); cin.sync_with_stdio(false); queue<Pos> pos_q; input(pos_q); cout<<simulate(pos_q)<<'\n'; return 0; }

Compilation message (stderr)

civilization.cpp: In function 'int simulate(std::queue<std::pair<int, int> >&)':
civilization.cpp:59:30: warning: unused variable 'adj_civilization' [-Wunused-variable]
     int current_civilization,adj_civilization;
                              ^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...