제출 #70993

#제출 시각아이디문제언어결과실행 시간메모리
70993IvanC물병 (JOI14_bottle)C++17
100 / 100
1601 ms239676 KiB
#include <bits/stdc++.h>
using namespace std;

typedef pair<int,int> ii;
typedef tuple<int,int,int> trinca;

struct pergunta{
	
	int ini,fim,meio,resp,idx,u,v;

	pergunta(int _ini = 0,int _fim = 0,int _idx = 0,int _u = 0,int _v = 0){
		ini = _ini;
		fim = _fim;
		idx = _idx;
		resp = -1;
		meio = -1;
		u = _u;
		v = _v;
	}

	bool operator<(const pergunta& other)const{
		return meio < other.meio;
	}

};

const int MAXL = 2010;
const int MAXN = 2*1e5 + 10;

const int dx[4] = {1,-1,0,0};
const int dy[4] = {0,0,1,-1};

char entrada[MAXL][MAXL];
int grid[MAXL][MAXL],dist[MAXL][MAXL],H,W,P,Q,pai[MAXN];
int exibe[MAXN];
vector<trinca> Kruskal,MST;
vector<pergunta> D;
queue<ii> bfs;

int find(int x){
	if(x == pai[x]) return x;
	return pai[x] = find(pai[x]);
}

void join(int x,int y){
	x = find(x);
	y = find(y);
	if(x == y) return;
	if(x > y) swap(x,y);
	pai[y] = x;
}

inline int valido(int x,int y){
	return x >= 0 && x < H && y >= 0 && y < W && entrada[x][y] != '#';
}

void reseta_dsu(){
	for(int i = 1;i<=P;i++) pai[i] = i;
}

int main(){

	scanf("%d %d %d %d",&H,&W,&P,&Q);
	for(int i = 0;i<H;i++){
		scanf("%s",entrada[i]);
	}
	for(int i = 1;i<=P;i++){
		int x,y;
		scanf("%d %d",&x,&y);
		x--;y--;
		grid[x][y] = i;
		bfs.push({x,y});
	}
	for(int i = 1;i<=Q;i++){
		int u,v;
		scanf("%d %d",&u,&v);
		pergunta davez(0,P-2,i,u,v);
		D.push_back(davez);
	}

	while(!bfs.empty()){
		int x = bfs.front().first,y = bfs.front().second;
		bfs.pop();
		for(int i = 0;i<4;i++){
			int nx = x + dx[i],ny = y + dy[i];
			if(!valido(nx,ny) || grid[nx][ny] != 0) continue;
			grid[nx][ny] = grid[x][y];
			dist[nx][ny] = dist[x][y] + 1;
			bfs.push({nx,ny});
		}
	}

	for(int i = 0;i<H;i++){
		for(int j = 0;j < W;j++){
			if(!valido(i,j)) continue;
			if(valido(i+1,j) && grid[i][j] != grid[i+1][j]){
				Kruskal.push_back({dist[i][j] + dist[i+1][j], grid[i][j], grid[i+1][j] });
			}
			if(valido(i,j+1) && grid[i][j] != grid[i][j+1]){
				Kruskal.push_back({dist[i][j] + dist[i][j+1],grid[i][j], grid[i][j+1]});
			}
		}
	}

	sort(Kruskal.begin(),Kruskal.end());
	reseta_dsu();
	for(int i = 0;i<Kruskal.size();i++){
		int u = get<1>(Kruskal[i]),v = get<2>(Kruskal[i]);
		if(find(u) != find(v)){
			join(u,v);
			MST.push_back(Kruskal[i]);
		}
	}

	for(int iteracao = 1;iteracao <= 19;iteracao++){

		int meu_ptr = 0;

		for(int i = 0;i<D.size();i++){
			if(D[i].ini > D[i].fim){
				D[i].meio = P;
			}
			else{
				D[i].meio = (D[i].ini + D[i].fim)/2;
			}
		}

		reseta_dsu();
		sort(D.begin(),D.end());

		for(int i = 0;i<D.size();i++){
			if(D[i].meio == P) break;
			while(meu_ptr < MST.size() && meu_ptr <= D[i].meio){
				join(get<1>(MST[meu_ptr]),get<2>(MST[meu_ptr]));
				meu_ptr++;
			}
			if(find(D[i].u) == find(D[i].v)){
				D[i].resp = D[i].meio;
				D[i].fim = D[i].meio - 1;
			}
			else{
				D[i].ini = D[i].meio + 1;
			}
		}

	}

	for(int i = 0;i<D.size();i++) exibe[D[i].idx] = D[i].resp;

	for(int i = 1;i<=Q;i++){
		if(exibe[i] == -1) printf("-1\n");
		else printf("%d\n",get<0>(MST[exibe[i]]));
	}

	return 0;

}

컴파일 시 표준 에러 (stderr) 메시지

bottle.cpp: In function 'int main()':
bottle.cpp:107:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0;i<Kruskal.size();i++){
                ~^~~~~~~~~~~~~~~
bottle.cpp:119:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0;i<D.size();i++){
                 ~^~~~~~~~~
bottle.cpp:131:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0;i<D.size();i++){
                 ~^~~~~~~~~
bottle.cpp:133:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    while(meu_ptr < MST.size() && meu_ptr <= D[i].meio){
          ~~~~~~~~^~~~~~~~~~~~
bottle.cpp:148:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0;i<D.size();i++) exibe[D[i].idx] = D[i].resp;
                ~^~~~~~~~~
bottle.cpp:63:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d %d %d",&H,&W,&P,&Q);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
bottle.cpp:65:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%s",entrada[i]);
   ~~~~~^~~~~~~~~~~~~~~~~
bottle.cpp:69:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d",&x,&y);
   ~~~~~^~~~~~~~~~~~~~~
bottle.cpp:76:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d",&u,&v);
   ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...