Submission #1039167

#TimeUsernameProblemLanguageResultExecution timeMemory
1039167RecursiveCoClosing Time (IOI23_closing)C++17
8 / 100
103 ms35016 KiB
// CF template, version 3.0 #include <bits/stdc++.h> using namespace std; #define improvePerformance ios_base::sync_with_stdio(false); cin.tie(0) #define getTest int t; cin >> t #define eachTest for (int _var=0;_var<t;_var++) #define get(name) int (name); cin >> (name) #define out(o) cout << (o) #define getList(cnt, name) vector<int> (name); for (int _=0;_<(cnt);_++) { get(a); (name).push_back(a); } #define sortl(name) sort((name).begin(), (name).end()) #define rev(name) reverse((name).begin(), (name).end()) #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++) #define decision(b) if (b){out("YES");}else{out("NO");} //#define int long long int template <typename T, typename I> struct segtree { int n; vector<T> tree; vector<I> initial; T id; segtree(int i_n, vector<I> i_initial, T i_id): n(i_n), initial(i_initial), id(i_id) { tree.resize(4 * n); } T conquer(T left, T right) { // write your conquer function } T value(I inp) { // write your value function } void build(int v, int l, int r) { if (l == r) tree[v] = value(initial[l]); else { int middle = (l + r) / 2; build(2 * v, l, middle); build(2 * v + 1, middle + 1, r); tree[v] = conquer(tree[2 * v], tree[2 * v + 1]); } } void upd(int v, int l, int r, int i, I x) { if (l == r) tree[v] = value(x); else { int middle = (l + r) / 2; if (middle >= i) upd(2 * v, l, middle, i, x); else upd(2 * v + 1, middle + 1, r, i, x); tree[v] = conquer(tree[2 * v], tree[2 * v + 1]); } } T query(int v, int l, int r, int ql, int qr) { if (ql <= l && r <= qr) return tree[v]; else if (r < ql || qr < l) return id; int middle = (l + r) / 2; T left = query(2 * v, l, middle, ql, qr); T right = query(2 * v + 1, middle + 1, r, ql, qr); return conquer(left, right); } }; // vector<int> vector<vector<pair<int, int>>> adjList; vector<long long> fromX; vector<long long> fromY; void dfs(int v, int p, long long d, int which) { if (which) fromY[v] = d; else fromX[v] = d; for (auto pa: adjList[v]) { int con = pa.first; long long w = pa.second; if (con == p) continue; dfs(con, v, d + w, which); } } int max_score(int N, int X, int Y, long long K, vector<int> U, vector<int> V, vector<int> W) { adjList.clear(); adjList.resize(N); fromX.clear(); fromX.resize(N); fromY.clear(); fromY.resize(N); forto(N - 1, i) { int a = U[i]; int b = V[i]; int w = W[i]; adjList[a].push_back({b, w}); adjList[b].push_back({a, w}); } dfs(X, -1, 0ll, 0); dfs(Y, -1, 0ll, 1); if (fromY[X] > 2 * K) { vector<long long> paths; forto(N, i) { paths.push_back(min(fromX[i], fromY[i])); } sortl(paths); int ans = 0; long long sum = 0; forto(N, i) { if (sum + paths[i] > K) break; sum += paths[i]; ans++; } return ans; } else { // assumption: path // case 1: everything in between contributes twice. long long C = fromX[Y]; // = fromY[X] long long sum1 = 0ll; int ans = 0; int ans1 = 0; vector<long long> far; forto(N, i) { int val = max(fromX[i], fromY[i]); if (val < C) sum1 += val, ans1 += 2; else far.push_back(min(fromX[i], fromY[i])); } int s = far.size(); if (sum1 <= K) { sortl(far); long long left = K - sum1; ans = max(ans, ans1); long long farsum = 0; forto(s, i) { farsum += far[i]; if (farsum > left) break; long long extra = (left - farsum) / C; int extraint = extra > (long long) (i + 1)? i + 1: (int) extra; ans = max(ans, ans1 + (i + 1) + extraint); } } vector<pair<long long, int>> middle; forto(N, i) { int val = max(fromX[i], fromY[i]); if (val < C) middle.push_back({fromX[i], i}); } sortl(middle); int midsz = middle.size(); int ans2 = 0; far.push_back(0); s++; sortl(far); long long sum2 = 0ll; forto(s, i) { sum2 += far[i]; if (sum2 > K) break; long long left = K - sum2; forto(midsz + 1, l) { long long taken = 0ll; for (int r = l; r <= midsz; r++) { if (r != midsz) taken += max(middle[r].first, fromY[middle[r].second]); if (taken > left) break; vector<long long> once; forto(l, j) once.push_back(min(middle[j].first, fromY[middle[j].second])); for (int j = r + 1; j < midsz; j++) once.push_back(min(middle[j].first, fromY[middle[j].second])); sortl(once); long long remain = left - taken; int o = once.size(); int here = 0; forto(o, i) { if (remain < once[i]) break; here++; remain -= once[i]; } ans2 = max(ans2, (i + 1) + 2 * (r == midsz? r - l: r - l + 1) + here - 1); if (ans2 == 4) out(l), out(r); } } } ans = max(ans, ans2); return ans; } }

Compilation message (stderr)

closing.cpp: In function 'int max_score(int, int, int, long long int, std::vector<int>, std::vector<int>, std::vector<int>)':
closing.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
      |                                   ^
closing.cpp:93:5: note: in expansion of macro 'forto'
   93 |     forto(N - 1, i) {
      |     ^~~~~
closing.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
      |                                   ^
closing.cpp:104:9: note: in expansion of macro 'forto'
  104 |         forto(N, i) {
      |         ^~~~~
closing.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
      |                                   ^
closing.cpp:110:9: note: in expansion of macro 'forto'
  110 |         forto(N, i) {
      |         ^~~~~
closing.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
      |                                   ^
closing.cpp:124:9: note: in expansion of macro 'forto'
  124 |         forto(N, i) {
      |         ^~~~~
closing.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
      |                                   ^
closing.cpp:136:13: note: in expansion of macro 'forto'
  136 |             forto(s, i) {
      |             ^~~~~
closing.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
      |                                   ^
closing.cpp:146:9: note: in expansion of macro 'forto'
  146 |         forto(N, i) {
      |         ^~~~~
closing.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
      |                                   ^
closing.cpp:158:9: note: in expansion of macro 'forto'
  158 |         forto(s, i) {
      |         ^~~~~
closing.cpp:15:35: warning: unnecessary parentheses in declaration of 'l' [-Wparentheses]
   15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
      |                                   ^
closing.cpp:162:13: note: in expansion of macro 'forto'
  162 |             forto(midsz + 1, l) {
      |             ^~~~~
closing.cpp:15:35: warning: unnecessary parentheses in declaration of 'j' [-Wparentheses]
   15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
      |                                   ^
closing.cpp:168:21: note: in expansion of macro 'forto'
  168 |                     forto(l, j) once.push_back(min(middle[j].first, fromY[middle[j].second]));
      |                     ^~~~~
closing.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
      |                                   ^
closing.cpp:174:21: note: in expansion of macro 'forto'
  174 |                     forto(o, i) {
      |                     ^~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...