Submission #391644

#TimeUsernameProblemLanguageResultExecution timeMemory
391644abdzagValley (BOI19_valley)C++17
59 / 100
3057 ms26216 KiB
#include<bits/stdc++.h> #include<unordered_set> #define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> #define PI 3.141592653 #define rep(i,a,b) for(int i = a; i<int(b);++i) #define rrep(i,a,b) for(int i = a; i>int(b);--i) #define all(v) v.begin(),v.end() #define trav(a, x) for(auto& a : x) typedef long long ll; const long long inf = 1e15; using namespace std; void printint(vector < ll > vec) { for (auto a : vec) { cout << a << " "; } cout << endl; } void printstr(vector < string > vec) { for (auto a : vec) { cout << a << endl; } } void printchar(vector < char > vec) { for (auto a : vec) { cout << a; } cout << endl; } void print2d(vector < vector < ll >> vec) { for (int i = 0; i < vec.size(); i++) { printint(vec[i]); } cout << endl; } void printmap(map<int, long double> myMap) { for (auto it = myMap.cbegin(); it != myMap.cend(); ++it) { std::cout << it->first << " "; cout << it->second << " "; } } void print2dchar(vector < vector < char >> vec) { for (auto a : vec) { printchar(a); } cout << endl; } bool sortcol(const vector<int>& v1, const vector<int>& v2) { return v1[1] < v2[1]; } void printsetint(set<ll> s) { for (auto it = s.begin(); it != s.end(); ++it) { cout << *it; } } void printsetpairint(set<pair<int, int>> s) { for (auto it = s.begin(); it != s.end(); ++it) { pair<int, int> cur = *it; cout << cur.first << " " << cur.second; } cout << endl; } void printsetstring(set<string> s) { for (auto it = s.begin(); it != s.end(); ++it) { cout << *it << endl; } } struct MaxTree { typedef int T; static constexpr T unit = INT_MIN; T f(T a, T b) { return max(a, b); } // (any associative fn) vector<T> s; int n; MaxTree(int n = 0, T def = unit) : s(2 * n, def), n(n) {} void update(int pos, T val) { for (s[pos += n] = val; pos /= 2;) s[pos] = f(s[pos * 2], s[pos * 2 + 1]); } T query(int b, int e) { // query [b, e) T ra = unit, rb = unit; for (b += n, e += n; b < e; b /= 2, e /= 2) { if (b % 2) ra = f(ra, s[b++]); if (e % 2) rb = f(s[--e], rb); } return f(ra, rb); } }; struct MinTree { typedef int T; static constexpr T unit = INT_MAX; T f(T a, T b) { return min(a, b); } // (any associative fn) vector<T> s; int n; MinTree(int n = 0, T def = unit) : s(2 * n, def), n(n) {} void update(int pos, T val) { for (s[pos += n] = val; pos /= 2;) s[pos] = f(s[pos * 2], s[pos * 2 + 1]); } T query(int b, int e) { // query [b, e) T ra = unit, rb = unit; for (b += n, e += n; b < e; b /= 2, e /= 2) { if (b % 2) ra = f(ra, s[b++]); if (e % 2) rb = f(s[--e], rb); } return f(ra, rb); } }; vector<vector<pair<ll,ll>>> tree; vector<vector<pair<ll,ll>>> g; vector<ll> occurences; vector<pair<ll, ll>> when; void dfs(ll cur) { when[cur].first = occurences.size(); occurences.push_back(cur); trav(v, tree[cur]) dfs(v.first); when[cur].second = occurences.size(); occurences.push_back(cur); } int main() { cin.sync_with_stdio(false); ll n,s,Q,e; cin >> n>>s>>Q>>e; g.resize(n + 1); tree.resize(n + 1); when.resize(n + 1); vector<pair<ll,ll>>edges(n); vector<ll> parents(n + 1); rep(i, 1, n) { ll a, b,w; cin >> a >> b>>w; edges[i] = make_pair(a, b); g[a].emplace_back(b,w); g[b].emplace_back(a,w); } vector<ll> is_shop(n + 1); rep(i, 0, s) { ll a; cin >> a; is_shop[a] = true; } vector<bool> visitedChild(n + 1); queue<ll> q; q.push(e); while (!q.empty()) { ll cur = q.front(); q.pop(); visitedChild[cur] = true; rep(i, 0, g[cur].size()) { ll v = g[cur][i].first; ll w = g[cur][i].second; if (!visitedChild[v]) { tree[cur].emplace_back(v,w); parents[v] = cur; q.push(v); } } } if (s == n) { dfs(e); rep(i, 0, Q) { ll a, b; cin >> a >> b; ll parent; if (parents[edges[a].first] == edges[a].second) { parent = edges[a].first; } else if (parents[edges[a].second] == edges[a].first) { parent = edges[a].second; } else cout << "cringe" << endl; if (when[b].first >= when[parent].first && when[b].first <= when[parent].second) { cout << 0 << endl; } else cout << "escaped" << endl; } } else { rep(i, 0, Q) { ll a, b; cin >> a >> b; queue<ll> bfs; ll dist = inf; if (is_shop[b])dist = 0; vector<ll> dists(n + 1,-1); dists[b] = 0; bfs.push(b); while(!bfs.empty()) { ll cur = bfs.front(); bfs.pop(); trav(v, g[cur]) { if (dists[v.first]==-1) { if (make_pair(v.first, cur) != edges[a] && make_pair(cur, v.first) != edges[a]) { bfs.push(v.first); dists[v.first] = dists[cur] + v.second; if (is_shop[v.first])dist = min(dist, dists[v.first]); } } } } if (dists[e] != -1) { cout << "escaped" << endl; } else { if (dist == inf) { cout << "oo" << endl; } else cout << dist << endl; } } } return 0; }

Compilation message (stderr)

valley.cpp: In function 'void print2d(std::vector<std::vector<long long int> >)':
valley.cpp:40:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |     for (int i = 0; i < vec.size(); i++) {
      |                     ~~^~~~~~~~~~~~
valley.cpp: In function 'int main()':
valley.cpp:182:45: warning: 'parent' may be used uninitialized in this function [-Wmaybe-uninitialized]
  182 |             if (when[b].first >= when[parent].first && when[b].first <= when[parent].second) {
      |                                             ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...