Submission #1045860

#TimeUsernameProblemLanguageResultExecution timeMemory
1045860alex_2008Petrol stations (CEOI24_stations)C++14
36 / 100
3577 ms8824 KiB
#include <iostream> #include <cmath> #include <algorithm> #include <vector> #include <map> #include <queue> #include <stack> #include <set> typedef long long ll; using namespace std; const int N = 70070; ll cnt[N]; int subtree[N]; ll pref[N]; ll people[N]; vector <vector<pair<int, int>>> G; int n, k; void dfs_0(int v, int p) { subtree[v] = 1; for (auto it : G[v]) { if (it.first == p) continue; dfs_0(it.first, v); subtree[v] += subtree[it.first]; } } void dfs(int v, int p, int depth) { for (auto it : G[v]) { if (it.first == p) continue; int c = depth + it.second; if (c <= k) dfs(it.first, v, c); else { cnt[v] += subtree[it.first]; dfs(it.first, v, it.second); } } } void f(vector <int> indd, vector <int> len) { indd.insert(indd.begin(), 0); len.insert(len.begin(), 0); for (int i = 1; i < n; i++) { pref[i] = pref[i - 1] + len[i]; } for (int i = 1; i <= n; i++) { people[i] = 1; } for (int i = 1; i <= n; i++) { if ((pref[n - 1] - pref[i - 1]) <= k) continue; int ind = upper_bound(pref + 1, pref + n, pref[i - 1] + k) - pref; people[ind] += people[i]; cnt[indd[ind]] += (people[i] * 1ll * (n - ind)); } } int main() { cin >> n >> k; G.resize(n + 1); for (int i = 1; i < n; i++) { int a, b, c; cin >> a >> b >> c; a++; b++; G[a].push_back({ b, c }); G[b].push_back({ a, c }); } if (n <= 1000) { for (int i = 1; i <= n; i++) { dfs_0(i, i); dfs(i, i, 0); } for (int i = 1; i <= n; i++) { cout << cnt[i] << "\n"; } return 0; } vector <int> ind; vector <int> len; for (int i = 1; i <= n; i++) { if ((int)G[i].size() == 1) { ind.push_back(i); break; } } while ((int)ind.size() != n) { int v = ind.back(), p = -1; if ((int)ind.size() != 1) p = ind[(int)ind.size() - 2]; for (auto it : G[v]) { if (it.first == p) continue; ind.push_back(it.first); len.push_back(it.second); break; } } f(ind, len); reverse(ind.begin(), ind.end()); reverse(len.begin(), len.end()); f(ind, len); for (int i = 1; i <= n; i++) { cout << cnt[i] << "\n"; } }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...