Submission #129704

# Submission time Handle Problem Language Result Execution time Memory
129704 2019-07-13T05:11:40 Z 김세빈(#3138) 물병 (JOI14_bottle) C++14
30 / 100
5000 ms 41208 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++){
			if(find(K[j].u) == find(K[j].v)) for(; ; );
			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:84: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);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Incorrect 16 ms 5372 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 25 ms 10744 KB Output is correct
2 Correct 42 ms 8952 KB Output is correct
3 Correct 398 ms 40756 KB Output is correct
4 Correct 597 ms 40744 KB Output is correct
5 Correct 664 ms 41208 KB Output is correct
6 Correct 388 ms 40568 KB Output is correct
7 Correct 598 ms 40740 KB Output is correct
8 Correct 678 ms 41080 KB Output is correct
9 Correct 768 ms 41080 KB Output is correct
10 Correct 425 ms 40540 KB Output is correct
11 Correct 544 ms 40952 KB Output is correct
12 Correct 163 ms 33912 KB Output is correct
13 Correct 217 ms 33912 KB Output is correct
14 Correct 167 ms 34020 KB Output is correct
15 Correct 237 ms 33812 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 51 ms 10616 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 5089 ms 41052 KB Time limit exceeded
2 Halted 0 ms 0 KB -