제출 #1079538

#제출 시각아이디문제언어결과실행 시간메모리
1079538anango기지국 (IOI20_stations)C++17
72.51 / 100
642 ms1268 KiB
#include "stations.h" #include <vector> #include <bits/stdc++.h> using namespace std; #define cout cerr vector<vector<int>> adjlist; vector<int> depth; vector<int> tin; vector<int> tout; int tim = 0; void dfs(int node, int par) { tin[node] = tim++; for (int j:adjlist[node]) { if (j!=par) { depth[j] = depth[node]+1; dfs(j,node); } } tout[node] = tim++; } std::vector<int> label(int n, int k, std::vector<int> u, std::vector<int> v) { tim = 0; std::vector<int> labels(n); adjlist=vector<vector<int>>(n); tin=tout=vector<int>(n,-1); depth=vector<int>(n,0); for (int i=0; i<n-1; i++) { adjlist[u[i]].push_back(v[i]); adjlist[v[i]].push_back(u[i]); } dfs(0,-1); for (int i = 0; i < n; i++) { if (depth[i]%2==1) { labels[i] = tin[i]; } else { labels[i] = 3000+tout[i]; } //cout << i << " " << tin[i] <<" " << tout[i] <<" " << labels[i] << endl; } //consider using the euler tour trick on the tree //for each node, store the left and right times of its subtree in the label (using perfect hashing) //for a node, you know the tin and tout (call these inv and outv) //then for every child, you also know the tin and tout of that child (call these inc and outc) //and the tin and tout of the destination (call these ind and outd) //so you know that if inv<=ind<=outd<=outv, then the destination is in this subtree //and if inc<=ind<=outd<=outc for some child, the destination is in the subtree of this child //if none of these hold, then go up //this uses at most n^2 labels //we could just use in but then it jambloats because we don't know where the subtree ends //actually what about storing out for even depth //because we know one of the in values for child for free //and if we know out[node] we know one out value for free //that should work for 2000 return labels; } int find_next_station(int s, int t, std::vector<int> c) { sort(c.begin(), c.end()); //cout << "TRY FIND " << endl; for (auto i:c) { //cout << i <<" "; } //cout << endl; //cout << "DOING " << s <<" " << t << endl; if (t>=3000) { t-=3000; } if (s>=3000) { //depth is even s-=3000; //so all the children are in-values, our node is an out-value //the lowest in-value is actually the parent, so that can be ignored c.push_back(s+1); sort(c.begin(), c.end()); //cout << s <<" " << c.size() << endl; for (auto i:c) { //cout << i <<" "; assert(i<3000); } //cout << endl; for (int i=2; i<c.size(); i++) { if (c[i-1]<=t && t<c[i]) { return c[i-1]; } } return c[0]; } else { //depth is odd for (int i=0; i<c.size(); i++) { c[i]-=3000; } //so all the children are out-values, our node is an in-value //max value is actually the parent c.push_back(s+1); sort(c.begin(), c.end()); //assert(c.front()==s+1); ////cout << "DOCTORED C " << endl; for (auto i:c) { //cout << i <<" "; } //cout << endl; for (int i=1; i<((int)c.size())-1; i++) { if (c[i-1]<=t && t<=c[i]) { return c[i]+3000; } } return c.back()+3000; } return c[0]; }

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

stations.cpp: In function 'int find_next_station(int, int, std::vector<int>)':
stations.cpp:69:15: warning: unused variable 'i' [-Wunused-variable]
   69 |     for (auto i:c) {
      |               ^
stations.cpp:90:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   90 |         for (int i=2; i<c.size(); i++) {
      |                       ~^~~~~~~~~
stations.cpp:99:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   99 |         for (int i=0; i<c.size(); i++) {
      |                       ~^~~~~~~~~
stations.cpp:108:19: warning: unused variable 'i' [-Wunused-variable]
  108 |         for (auto i:c) {
      |                   ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...