답안 #50848

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
50848 2018-06-13T16:48:59 Z Nicksechko Evacuation plan (IZhO18_plan) C++14
100 / 100
912 ms 83616 KB
//Solution by Tima
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <cstring>
#include <map>
#include <cstdlib>
#include <ctime>
#include <cassert>
#include <bitset>
#define f first
#define s second
#define ll long long
#define ull unsigned long long
#define mp make_pair
#define pb push_back
#define vi vector <int>
#define ld long double
#define pii pair<int, int>
#define y1 sda
using namespace std;    
const int N = int(5e5) + 10, mod = int(1e9)  + 7; 

int n,m,q,k, a[N], p[N], rnk[N], up[N][18], mx[N][18], tin[N], tout[N], timer;

vector <pair<int,int> > g[N];

vector <pair<int,pair<int,int> > > all;

priority_queue <pair<int,int> > pq;

bool was[N], used[N];

int get(int v){
	if(p[v] == v) return v;
	return p[v] = get(p[v]);
}

bool Merge(int a,int b){
    a = get(a);
    b = get(b);
    if(a == b) return 0;
    if(rnk[a] > rnk[b]) swap(a,b);
    rnk[b] += rnk[a];
    p[a] = b;
    return 1;
}

void dfs(int v){
	used[v] = 1;
	tin[v] = ++timer;
	for(auto p : g[v]){
		if(!used[p.f]){
			up[p.f][0] = v;
			mx[p.f][0] = p.s;
			dfs(p.f);
		}
	}
	tout[v] = ++timer;
}

bool ok(int u,int v){
	return (tin[u] <= tin[v] && tout[u] >= tout[v]);
}

int lca(int u,int v){
	if(ok(u,v)) return u;
	if(ok(v,u)) return v;
	for(int i = 17; i >= 0; i--){
		if(up[v][i] != -1 && !ok(up[v][i], u)) v = up[v][i];
	}
	return up[v][0];
}

int getx(int v,int u){
    if(v == u) return mod;
    int res = mod;
    for(int i = 17; i >= 0; i--){
    	if(up[v][i] != -1 && !ok(up[v][i], u)){
    		res = min(res, mx[v][i]);
    		v = up[v][i];
    	}
    }
    return min(res, mx[v][0]);
}

int get_min(int u,int v){
	int x = lca(u,v);
	return min(getx(u,x), getx(v,x));
}

int main () {
	scanf("%d%d", &n, &m);

	for(int i = 1,x,y,z; i <= m; i++){
		scanf("%d%d%d", &x, &y, &z);
		g[x].pb(mp(y,z));
		g[y].pb(mp(x,z));
		all.pb(mp(z, mp(x,y)));
	}

	scanf("%d", &k);

	for(int i = 1; i <= n; i++){
		a[i] = mod;
	}

	for(int i = 1,x; i <= k; i++){
		scanf("%d", &x);
		a[x] = 0;
		pq.push(mp(0, x));
	}

	while(!pq.empty()){
		int v = (pq.top()).s;
		pq.pop();
		if(was[v]) continue;
		was[v] = 1;
		for(auto p : g[v]){
			if(a[p.f] > a[v] + p.s){
				a[p.f] = a[v] + p.s;
				pq.push(mp(-a[p.f], p.f));
			}
		}
	}

	for(int i = 0; i < all.size(); i++)	{
		all[i].f = min(a[all[i].s.f], a[all[i].s.s]); 
	}
	
	sort(all.begin(), all.end());

	for(int i = 1; i <= n; i++){
		g[i].clear();
		p[i] = i;
		rnk[i] = 1;
	}

	reverse(all.begin(), all.end());

	for(int i = 0,x,y,z; i < all.size(); i++){
		x = all[i].s.f;
		y = all[i].s.s;
		z = all[i].f;
		if(Merge(x,y)){
			g[x].pb(mp(y,z));
			g[y].pb(mp(x,z));	
		}
	}

	memset(up, -1, sizeof(up));

	for(int j = 0; j <= 17; j++){
		for(int i = 1; i <= n; i++){
			mx[i][j] = mod;
		}
	}

	dfs(1);

	for(int j = 1; j <= 17; j++){
	    for(int i = 1; i <= n; i++) if(up[i][j - 1] != -1){
	        up[i][j] = up[up[i][j - 1]][j - 1];
	        mx[i][j] = min(mx[i][j - 1], mx[up[i][j - 1]][j - 1]);
	    }
	}
	scanf("%d", &q);
	int x,y;
	ll ans = 0,res = 0;
	while(q--){
		scanf("%d%d", &x, &y);
		printf("%d\n", get_min(x,y));
	}

return 0;
}

Compilation message

plan.cpp: In function 'int main()':
plan.cpp:133:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < all.size(); i++) {
                 ~~^~~~~~~~~~~~
plan.cpp:147:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0,x,y,z; i < all.size(); i++){
                       ~~^~~~~~~~~~~~
plan.cpp:175:5: warning: unused variable 'ans' [-Wunused-variable]
  ll ans = 0,res = 0;
     ^~~
plan.cpp:175:13: warning: unused variable 'res' [-Wunused-variable]
  ll ans = 0,res = 0;
             ^~~
plan.cpp:99:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &n, &m);
  ~~~~~^~~~~~~~~~~~~~~~
plan.cpp:102:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d", &x, &y, &z);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~
plan.cpp:108:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &k);
  ~~~~~^~~~~~~~~~
plan.cpp:115:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &x);
   ~~~~~^~~~~~~~~~
plan.cpp:173:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &q);
  ~~~~~^~~~~~~~~~
plan.cpp:177:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", &x, &y);
   ~~~~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 43 ms 47272 KB Output is correct
2 Correct 44 ms 47420 KB Output is correct
3 Correct 44 ms 47456 KB Output is correct
4 Correct 43 ms 47288 KB Output is correct
5 Correct 44 ms 47448 KB Output is correct
6 Correct 45 ms 47552 KB Output is correct
7 Correct 43 ms 47372 KB Output is correct
8 Correct 43 ms 47352 KB Output is correct
9 Correct 44 ms 47480 KB Output is correct
10 Correct 44 ms 47480 KB Output is correct
11 Correct 44 ms 47452 KB Output is correct
12 Correct 43 ms 47484 KB Output is correct
13 Correct 44 ms 47452 KB Output is correct
14 Correct 44 ms 47608 KB Output is correct
15 Correct 44 ms 47480 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 43 ms 47272 KB Output is correct
2 Correct 44 ms 47420 KB Output is correct
3 Correct 44 ms 47456 KB Output is correct
4 Correct 43 ms 47288 KB Output is correct
5 Correct 44 ms 47448 KB Output is correct
6 Correct 45 ms 47552 KB Output is correct
7 Correct 43 ms 47372 KB Output is correct
8 Correct 43 ms 47352 KB Output is correct
9 Correct 44 ms 47480 KB Output is correct
10 Correct 44 ms 47480 KB Output is correct
11 Correct 44 ms 47452 KB Output is correct
12 Correct 43 ms 47484 KB Output is correct
13 Correct 44 ms 47452 KB Output is correct
14 Correct 44 ms 47608 KB Output is correct
15 Correct 44 ms 47480 KB Output is correct
16 Correct 271 ms 61124 KB Output is correct
17 Correct 771 ms 81616 KB Output is correct
18 Correct 89 ms 50952 KB Output is correct
19 Correct 254 ms 65332 KB Output is correct
20 Correct 729 ms 80748 KB Output is correct
21 Correct 419 ms 68996 KB Output is correct
22 Correct 268 ms 67840 KB Output is correct
23 Correct 734 ms 81420 KB Output is correct
24 Correct 744 ms 81788 KB Output is correct
25 Correct 821 ms 81768 KB Output is correct
26 Correct 239 ms 65328 KB Output is correct
27 Correct 248 ms 65368 KB Output is correct
28 Correct 240 ms 65408 KB Output is correct
29 Correct 246 ms 65248 KB Output is correct
30 Correct 249 ms 64968 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 43 ms 47376 KB Output is correct
2 Correct 43 ms 47396 KB Output is correct
3 Correct 43 ms 47356 KB Output is correct
4 Correct 43 ms 47352 KB Output is correct
5 Correct 42 ms 47352 KB Output is correct
6 Correct 44 ms 47352 KB Output is correct
7 Correct 43 ms 47352 KB Output is correct
8 Correct 42 ms 47352 KB Output is correct
9 Correct 43 ms 47352 KB Output is correct
10 Correct 43 ms 47316 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 340 ms 68408 KB Output is correct
2 Correct 645 ms 81052 KB Output is correct
3 Correct 660 ms 81284 KB Output is correct
4 Correct 198 ms 65068 KB Output is correct
5 Correct 705 ms 81252 KB Output is correct
6 Correct 653 ms 81836 KB Output is correct
7 Correct 646 ms 81984 KB Output is correct
8 Correct 649 ms 82048 KB Output is correct
9 Correct 683 ms 81632 KB Output is correct
10 Correct 673 ms 81508 KB Output is correct
11 Correct 674 ms 81012 KB Output is correct
12 Correct 674 ms 81284 KB Output is correct
13 Correct 674 ms 81332 KB Output is correct
14 Correct 689 ms 81760 KB Output is correct
15 Correct 675 ms 82496 KB Output is correct
16 Correct 727 ms 80680 KB Output is correct
17 Correct 659 ms 81488 KB Output is correct
18 Correct 667 ms 81860 KB Output is correct
19 Correct 188 ms 66732 KB Output is correct
20 Correct 668 ms 81500 KB Output is correct
21 Correct 663 ms 80396 KB Output is correct
22 Correct 189 ms 64668 KB Output is correct
23 Correct 205 ms 63404 KB Output is correct
24 Correct 190 ms 65052 KB Output is correct
25 Correct 186 ms 65224 KB Output is correct
26 Correct 204 ms 64072 KB Output is correct
27 Correct 227 ms 66740 KB Output is correct
28 Correct 185 ms 65052 KB Output is correct
29 Correct 202 ms 66064 KB Output is correct
30 Correct 184 ms 65044 KB Output is correct
31 Correct 205 ms 66072 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 43 ms 47272 KB Output is correct
2 Correct 44 ms 47420 KB Output is correct
3 Correct 44 ms 47456 KB Output is correct
4 Correct 43 ms 47288 KB Output is correct
5 Correct 44 ms 47448 KB Output is correct
6 Correct 45 ms 47552 KB Output is correct
7 Correct 43 ms 47372 KB Output is correct
8 Correct 43 ms 47352 KB Output is correct
9 Correct 44 ms 47480 KB Output is correct
10 Correct 44 ms 47480 KB Output is correct
11 Correct 44 ms 47452 KB Output is correct
12 Correct 43 ms 47484 KB Output is correct
13 Correct 44 ms 47452 KB Output is correct
14 Correct 44 ms 47608 KB Output is correct
15 Correct 44 ms 47480 KB Output is correct
16 Correct 271 ms 61124 KB Output is correct
17 Correct 771 ms 81616 KB Output is correct
18 Correct 89 ms 50952 KB Output is correct
19 Correct 254 ms 65332 KB Output is correct
20 Correct 729 ms 80748 KB Output is correct
21 Correct 419 ms 68996 KB Output is correct
22 Correct 268 ms 67840 KB Output is correct
23 Correct 734 ms 81420 KB Output is correct
24 Correct 744 ms 81788 KB Output is correct
25 Correct 821 ms 81768 KB Output is correct
26 Correct 239 ms 65328 KB Output is correct
27 Correct 248 ms 65368 KB Output is correct
28 Correct 240 ms 65408 KB Output is correct
29 Correct 246 ms 65248 KB Output is correct
30 Correct 249 ms 64968 KB Output is correct
31 Correct 43 ms 47376 KB Output is correct
32 Correct 43 ms 47396 KB Output is correct
33 Correct 43 ms 47356 KB Output is correct
34 Correct 43 ms 47352 KB Output is correct
35 Correct 42 ms 47352 KB Output is correct
36 Correct 44 ms 47352 KB Output is correct
37 Correct 43 ms 47352 KB Output is correct
38 Correct 42 ms 47352 KB Output is correct
39 Correct 43 ms 47352 KB Output is correct
40 Correct 43 ms 47316 KB Output is correct
41 Correct 340 ms 68408 KB Output is correct
42 Correct 645 ms 81052 KB Output is correct
43 Correct 660 ms 81284 KB Output is correct
44 Correct 198 ms 65068 KB Output is correct
45 Correct 705 ms 81252 KB Output is correct
46 Correct 653 ms 81836 KB Output is correct
47 Correct 646 ms 81984 KB Output is correct
48 Correct 649 ms 82048 KB Output is correct
49 Correct 683 ms 81632 KB Output is correct
50 Correct 673 ms 81508 KB Output is correct
51 Correct 674 ms 81012 KB Output is correct
52 Correct 674 ms 81284 KB Output is correct
53 Correct 674 ms 81332 KB Output is correct
54 Correct 689 ms 81760 KB Output is correct
55 Correct 675 ms 82496 KB Output is correct
56 Correct 727 ms 80680 KB Output is correct
57 Correct 659 ms 81488 KB Output is correct
58 Correct 667 ms 81860 KB Output is correct
59 Correct 188 ms 66732 KB Output is correct
60 Correct 668 ms 81500 KB Output is correct
61 Correct 663 ms 80396 KB Output is correct
62 Correct 189 ms 64668 KB Output is correct
63 Correct 205 ms 63404 KB Output is correct
64 Correct 190 ms 65052 KB Output is correct
65 Correct 186 ms 65224 KB Output is correct
66 Correct 204 ms 64072 KB Output is correct
67 Correct 227 ms 66740 KB Output is correct
68 Correct 185 ms 65052 KB Output is correct
69 Correct 202 ms 66064 KB Output is correct
70 Correct 184 ms 65044 KB Output is correct
71 Correct 205 ms 66072 KB Output is correct
72 Correct 431 ms 69512 KB Output is correct
73 Correct 777 ms 83616 KB Output is correct
74 Correct 794 ms 83076 KB Output is correct
75 Correct 912 ms 81868 KB Output is correct
76 Correct 835 ms 81664 KB Output is correct
77 Correct 757 ms 81924 KB Output is correct
78 Correct 762 ms 81896 KB Output is correct
79 Correct 852 ms 81844 KB Output is correct
80 Correct 779 ms 81012 KB Output is correct
81 Correct 780 ms 81180 KB Output is correct
82 Correct 772 ms 80660 KB Output is correct
83 Correct 786 ms 80552 KB Output is correct
84 Correct 761 ms 80596 KB Output is correct
85 Correct 771 ms 81896 KB Output is correct
86 Correct 756 ms 80936 KB Output is correct
87 Correct 772 ms 80844 KB Output is correct
88 Correct 788 ms 81344 KB Output is correct
89 Correct 348 ms 66860 KB Output is correct
90 Correct 761 ms 80864 KB Output is correct
91 Correct 737 ms 80900 KB Output is correct
92 Correct 290 ms 65188 KB Output is correct
93 Correct 345 ms 64200 KB Output is correct
94 Correct 265 ms 64576 KB Output is correct
95 Correct 265 ms 64908 KB Output is correct
96 Correct 327 ms 63484 KB Output is correct
97 Correct 364 ms 65656 KB Output is correct
98 Correct 261 ms 64836 KB Output is correct
99 Correct 371 ms 67204 KB Output is correct
100 Correct 259 ms 65308 KB Output is correct