답안 #129703

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
129703 2019-07-13T05:10:38 Z 김세빈(#3138) 물병 (JOI14_bottle) C++14
30 / 100
5000 ms 41324 KB
#include <bits/stdc++.h>

using namespace std;

struct edge{
	int u, v, c;
	edge() {}
	edge(int u, int v, int c) : u(u), v(v), c(c) {}
};

char B[2020][2020];
queue <int> Q;
vector <edge> K, T;
vector <int> V[202020];
int C[4040404], D[4040404], P[202020];
int X[202020], Y[202020], S[202020], E[202020];
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
int n, m, k, q;

int find(int p) { return p == P[p]? p : P[p] = find(P[p]); }
void unite(int p, int q) { P[find(p)] = find(q); }

int main()
{
	int i, x, y, p, t, f;
	
	scanf("%d%d%d%d", &n, &m, &k, &q);
	
	for(i=0; i<n; i++){
		scanf("%s", B[i]);
	}
	
	for(i=1; i<=k; i++){
		scanf("%d%d", &x, &y);
		x --; y --; t = x * m + y;
		Q.push(t); C[t] = i; D[t] = 0;
		P[i] = i;
	}
	
	for(; !Q.empty(); ){
		p = Q.front(); Q.pop();
		x = p / m; y = p % m;
		
		for(i=0; i<4; i++){
			x += dx[i]; y += dy[i];
			if(0 <= x && x < n && 0 <= y && y < m && B[x][y] == '.'){
				t = x * m + y;
				if(!C[t]) Q.push(t), C[t] = C[p], D[t] = D[p] + 1;
				else if(find(C[t]) != find(C[p])){
					if(D[t] == D[p]){
						unite(C[t], C[p]);
						K.emplace_back(C[p], C[t], D[t] + D[p]);
					}
					else T.emplace_back(C[p], C[t], D[t] + D[p]);
				}
			}
			x -= dx[i]; y -= dy[i];
		}
		
		for(edge &x: T){
			if(find(x.u) != find(x.v)){
				unite(x.u, x.v);
				K.push_back(x);
			}
		}
		
		T.clear();
	}
	
	sort(K.begin(), K.end(), [&](edge &ea, edge &eb){
		return ea.c < eb.c;
	});
	
	for(i=1; i<=q; i++){
		scanf("%d%d", X + i, Y + i);
//		S[i] = 0; E[i] = K.size() - 1;
		int j;
		for(j=1; j<=k; j++) P[j] = j;
		for(j=0; j<K.size(); j++){
			unite(K[j].u, K[j].v);
			if(find(X[i]) == find(Y[i])) break;
		}
		if(j < K.size()) printf("%d\n", K[j].c);
		else printf("-1\n");
	}
/*	
	for(; ; ){
		for(i=1; i<=k; i++){
			P[i] = i;
		}
		
		for(i=0; i<K.size(); i++){
			V[i].clear();
		}
		
		for(i=1, f=0; i<=q; i++){
			if(S[i] <= E[i]){
				V[S[i] + E[i] >> 1].push_back(i);
				f = 1;
			}
		}
		
		if(!f) break;
		
		for(i=0; i<K.size(); i++){
			unite(K[i].u, K[i].v);
			for(int &t: V[i]){
				if(find(X[t]) == find(Y[t])){
					E[t] = (S[t] + E[t] >> 1) - 1;
				}
				else S[t] = (S[t] + E[t] >> 1) + 1;
			}
		}
	}
	
	for(i=1; i<=q; i++){
		if(E[i] + 1 < K.size()) printf("%d\n", K[E[i] + 1].c);
		else printf("-1\n");
	}
*/		
	return 0;
}

Compilation message

bottle.cpp: In function 'int main()':
bottle.cpp:79:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(j=0; j<K.size(); j++){
            ~^~~~~~~~~
bottle.cpp:83:8: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(j < K.size()) printf("%d\n", K[j].c);
      ~~^~~~~~~~~~
bottle.cpp:25:21: warning: unused variable 'f' [-Wunused-variable]
  int i, x, y, p, t, f;
                     ^
bottle.cpp:27:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d%d%d", &n, &m, &k, &q);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
bottle.cpp:30:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%s", B[i]);
   ~~~~~^~~~~~~~~~~~
bottle.cpp:34: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:75:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", X + i, Y + i);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 14 ms 5368 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 10616 KB Output is correct
2 Correct 42 ms 9080 KB Output is correct
3 Correct 406 ms 40644 KB Output is correct
4 Correct 598 ms 40796 KB Output is correct
5 Correct 705 ms 41208 KB Output is correct
6 Correct 408 ms 40760 KB Output is correct
7 Correct 647 ms 40796 KB Output is correct
8 Correct 715 ms 41180 KB Output is correct
9 Correct 786 ms 41324 KB Output is correct
10 Correct 469 ms 40588 KB Output is correct
11 Correct 550 ms 40696 KB Output is correct
12 Correct 167 ms 33976 KB Output is correct
13 Correct 225 ms 33768 KB Output is correct
14 Correct 159 ms 34012 KB Output is correct
15 Correct 222 ms 33880 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 47 ms 10872 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5092 ms 41164 KB Time limit exceeded
2 Halted 0 ms 0 KB -