제출 #300262

#제출 시각아이디문제언어결과실행 시간메모리
300262Elephant52Highway Tolls (IOI18_highway)C++11
컴파일 에러
0 ms0 KiB
#include "highway.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef vector<int> vi; typedef vector<pair<int, int> > vpi; #define INF 1000000000 #define F first #define S second #define PB push_back #define MP make_pair #define rep(i,a,b) for (int i = a; i < b; i++) void setIO(string name) { freopen((name+".in").c_str(), "r", stdin); freopen((name+".out").c_str(), "w", stdout); } typedef struct node { int edge, vertex, dist; node() {}; node(int a, int b, int c) : vertex(a), edge(b), dist(c) {}; } node; vpi adj[90000]; vi tree_adj[90000]; vi edge_dist[90000]; bool seen[90000]; int subtree_sizes[90000]; void make_spanning_tree(int cur) { seen[cur] = 1; for (auto p : adj[cur]) { edge = p.F; if (!seen[edge]) { make_spanning_tree(edge); tree_adj[cur].PB(edge); tree_adj[edge].PB(cur); } } } void find_sizes(int cur) { seen[cur] = subtree_sizes[cur] = 1; for (auto edge : tree_adj[cur]) { if (!seen[edge]) { find_sizes(edge); subtree_sizes[cur] += subtree_sizes[edge]; } } } int find_centroid(int N) { find_sizes(0); int centroid = 0, largest_subtree, next = 0; do { centroid = next; largest_subtree = 0; int nxt; for (auto edge : adj[centroid]) { if (subtree_sizes[edge.F] > largest_subtree) { largest_subtree = subtree_sizes[N]; nxt = edge.F; } } } while(largest_subtree >= N/2+1 && N - subtree_sizes[centroid] >= N/2+1); return centroid; } void find_pair(int N, vi U, vi V, int A, int B) { int S, T, dist; vi w(M, 0); //query edge list rep(i,0,M) { adj[U[i]].emplace_back(V[i], i); adj[V[i]].emplace_back(U[i], i); } make_spanning_tree(0); memset(seen, 0, sizeof(seen)); queue<pii> bfs; bfs.push(MP(find_centroid(N), 1)); int tree_height = 0; while (!bfs.empty()) { pii cur = bfs.front(); bfs.pop(); //vertex, distance tree_height = max(tree_height, cur.S); seen[cur] = 1; for (auto edge : adj[cur]) { edge_dist[cur.S].PB(edge.S); if (!seen[edge.F]) bfs.push(MP(edge.F, cur.S)); } } assert(A > 0); dist = ask(w)/A; int low = 1, high = tree_height; while (low < high) { int mid = (low + high)/2; for (int i = tree_height-1; i >= mid; i--) { for (auto edge : edge_dist[i]) w[edge] = 1; } int res = ask(w); if (res > dist*A) low = mid+1; else high = mid; memset(&w[0], 0, sizeof(w[0])*M); } int lower_point = low-1; //depth of lower point int low = 0, high = edge_dist[lower_point].size(); while (low < high) { int mid = (low + high)/2; for (int i = 0; i <= mid; i++) w[edge_dist[lower_point][i]] = 1; int res = ask(w); if (res > dist*A) high = mid; else low = mid+1; memset(&w[0], 0, sizeof(w[0])*M); } S = min(U[edge_dist[lower_point][low]], V[edge_dist[lower_point][low]]) queue<node> bfs2; bfs2.push(node(S, 0, 0)); memset(seen, 0, sizeof(seen)); while (!bfs2.empty()) { auto cur = bfs.front(); bfs.pop(); if (dist == cur.dist) { w[edge] = 1; int res = ask(w); if (res > dist*A) { T = cur.vertex; break; } w[edge] = 0; } for (auto edge : adj[cur.vertex]) { if (!v[edge.F]) { bfs.push(node(edge.F, edge.S, cur.dist+1)); } } } answer(S, T); }

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

highway.cpp: In constructor 'node::node(int, int, int)':
highway.cpp:24:12: warning: 'node::vertex' will be initialized after [-Wreorder]
   24 |  int edge, vertex, dist;
      |            ^~~~~~
highway.cpp:24:6: warning:   'int node::edge' [-Wreorder]
   24 |  int edge, vertex, dist;
      |      ^~~~
highway.cpp:26:2: warning:   when initialized here [-Wreorder]
   26 |  node(int a, int b, int c) : vertex(a), edge(b), dist(c) {};
      |  ^~~~
highway.cpp: In function 'void make_spanning_tree(int)':
highway.cpp:38:3: error: 'edge' was not declared in this scope
   38 |   edge = p.F;
      |   ^~~~
highway.cpp: In function 'void find_sizes(int)':
highway.cpp:48:33: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   48 |  seen[cur] = subtree_sizes[cur] = 1;
      |              ~~~~~~~~~~~~~~~~~~~^~~
highway.cpp: In function 'void find_pair(int, vi, vi, int, int)':
highway.cpp:77:7: error: 'M' was not declared in this scope
   77 |  vi w(M, 0); //query edge list
      |       ^
highway.cpp:95:7: error: no match for 'operator[]' (operand types are 'bool [90000]' and 'pii' {aka 'std::pair<int, int>'})
   95 |   seen[cur] = 1;
      |       ^
highway.cpp:97:23: error: no match for 'operator[]' (operand types are 'vpi [90000]' {aka 'std::vector<std::pair<int, int> > [90000]'} and 'pii' {aka 'std::pair<int, int>'})
   97 |   for (auto edge : adj[cur]) {
      |                       ^
highway.cpp:124:6: error: redeclaration of 'int low'
  124 |  int low = 0, high = edge_dist[lower_point].size();
      |      ^~~
highway.cpp:106:6: note: 'int low' previously declared here
  106 |  int low = 1, high = tree_height;
      |      ^~~
highway.cpp:124:15: error: redeclaration of 'int high'
  124 |  int low = 0, high = edge_dist[lower_point].size();
      |               ^~~~
highway.cpp:106:15: note: 'int high' previously declared here
  106 |  int low = 1, high = tree_height;
      |               ^~~~
highway.cpp:138:73: error: expected ';' before 'queue'
  138 |  S = min(U[edge_dist[lower_point][low]], V[edge_dist[lower_point][low]])
      |                                                                         ^
      |                                                                         ;
  139 | 
  140 |  queue<node> bfs2;
      |  ~~~~~                                                                   
highway.cpp:142:2: error: 'bfs2' was not declared in this scope; did you mean 'bfs'?
  142 |  bfs2.push(node(S, 0, 0));
      |  ^~~~
      |  bfs
highway.cpp:147:19: error: 'struct std::pair<int, int>' has no member named 'dist'
  147 |   if (dist == cur.dist) {
      |                   ^~~~
highway.cpp:148:6: error: 'edge' was not declared in this scope
  148 |    w[edge] = 1;
      |      ^~~~
highway.cpp:151:13: error: 'struct std::pair<int, int>' has no member named 'vertex'
  151 |     T = cur.vertex;
      |             ^~~~~~
highway.cpp:156:28: error: 'struct std::pair<int, int>' has no member named 'vertex'
  156 |   for (auto edge : adj[cur.vertex]) {
      |                            ^~~~~~
highway.cpp:157:9: error: 'v' was not declared in this scope
  157 |    if (!v[edge.F]) {
      |         ^
highway.cpp:158:39: error: 'struct std::pair<int, int>' has no member named 'dist'
  158 |     bfs.push(node(edge.F, edge.S, cur.dist+1));
      |                                       ^~~~
highway.cpp: In function 'void setIO(std::string)':
highway.cpp:19:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   19 |  freopen((name+".in").c_str(), "r", stdin);
      |  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
highway.cpp:20:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   20 |  freopen((name+".out").c_str(), "w", stdout);
      |  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~