Submission #1259202

#TimeUsernameProblemLanguageResultExecution timeMemory
1259202onbertClosing Time (IOI23_closing)C++20
Compilation error
0 ms0 KiB
#include "closing.h" #include <bits/stdc++.h> using namespace std; #define int long long struct thing { int val, j, id; bool operator < (const thing b) const { if (val != b.val) return val < b.val; if (j != b.j) return j < b.j; return id < b.id; } }; const int maxn = 2e5 + 5, INF = 2e18 + 10; int n, X, Y, k, D; vector<pair<int,int>> adj[maxn]; int dist[maxn][2], state[maxn]; int cost1[maxn], cost2[maxn]; void dfs(int u, int j) { for (auto [v, w]:adj[u]) if (dist[v][j] == -1) { dist[v][j] = dist[u][j] + w; dfs(v, j); } } map<int, vector<pair<int,int>>> mp; set<pair<int,int>> s1, s2; vector<thing> ord; int dc(thing x) {return lower_bound(ord.begin(), ord.end(), x) - ord.begin();} int sz; int fen[maxn * 3][2]; void update1(int id, int val, int j) { while (id <= sz) { fen[id][j] += val; id += (id & -id); } } int qry1(int id, int j) { int val = 0; while (id >= 1) { val += fen[id][j]; id -= (id & -id); } return val; } multiset<int> hv1; int ans, added, curans; void update(int u, int x) { if (state[u] == 1) { int pos = dc({cost1[u], 1, u}); update1(pos, -cost1[u], 0); update1(pos, -1, 1); hv1.erase(hv1.find(cost1[u])); s1.erase({cost1[u], u}); } else if (state[u] == 2) { int pos = dc({cost2[u]/2, 2, u}); update1(pos, -cost2[u]/2, 0); update1(pos, -1, 1); pos++; update1(pos, -cost2[u]/2, 0); update1(pos, -1, 1); s2.erase({cost2[u], u}); } else if (state[u] == 3) { added -= cost1[u]; curans--; } else if (state[u] == 4) { added -= cost2[u]; curans -= 2; } state[u] = x; if (x == 1) { int pos = dc({cost1[u], 1, u}); update1(pos, cost1[u], 0); update1(pos, 1, 1); hv1.insert(cost1[u]); s1.insert({cost1[u], u}); } else if (x == 2) { int pos = dc({cost2[u]/2, 2, u}); update1(pos, cost2[u]/2, 0); update1(pos, 1, 1); pos++; update1(pos, cost2[u]/2, 0); update1(pos, 1, 1); s2.insert({cost2[u], u}); } else if (x == 3) { added += cost1[u]; curans++; } else if (x == 4) { added += cost2[u]; curans += 2; } } int qry() { int l = 0, r = sz; while (l < r) { int mid = (l + r + 1) / 2; if (qry1(mid, 0) + curans <= k) l = mid; else r = mid - 1; } int u = ord[l].id; if ((qry1(l, 1) - qry(l-1, 1)) && state[u] == 2 && l + 1 <= sz && ord[l+1].id == u) { if (qry1(l-1, 0) + *hv1.upper_bound(cost2[u]/2) > k && qry1(l+1, 0) - *prev(hv1.upper_bound(cost2[u]/2)) > k) { return qry1(l, 1) - 1; } } return qry1(l, 1); } int32_t max_score(int32_t N, int32_t XX, int32_t YY, int K, vector<int32_t> U, vector<int32_t> V, vector<int32_t> W) { n = N, X = XX, Y = YY, k = K * 2; for (int i=0;i<n;i++) adj[i].clear(); for (int i=0;i<U.size();i++) { adj[U[i]].push_back({V[i], W[i] * 2}); adj[V[i]].push_back({U[i], W[i] * 2}); } for (int i=0;i<n;i++) for (int j=0;j<=1;j++) dist[i][j] = -1; dist[X][0] = 0; dfs(X, 0); dist[Y][1] = 0; dfs(Y, 1); D = dist[Y][0]; ord = {{0, -1, -1}}; mp.clear(); while (s1.size()) s1.erase(s1.begin()); while (s2.size()) s2.erase(s2.begin()); while (hv1.size()) hv1.erase(hv1.begin()); hv1.insert(-INF); hv1.insert(INF); for (int i=0;i<n;i++) { cost1[i] = min(dist[i][0], dist[i][1]); cost2[i] = max(dist[i][0], dist[i][1]); int del = cost2[i] - cost1[i]; mp[del].push_back({cost1[i], i}); ord.push_back({cost1[i], 1, i}); ord.push_back({cost2[i]/2, 2, i}); ord.push_back({cost2[i]/2, 2, i}); state[i] = 0; } sort(ord.begin(), ord.end()); sz = (int)ord.size() - 1; for (int i=1;i<=sz;i++) fen[i][0] = fen[i][1] = 0; added = 0, curans = 0; for (int i=0;i<n;i++) update(i, 1); ans = qry(); for (int i=0;i<n;i++) { if (cost1[i] + cost2[i] == D) update(i, 3); else update(i, 1); } for (auto [del, vec]:mp) { sort(vec.begin(), vec.end()); for (auto [x, i]:vec) { update(i, 4); if (added <= k) ans = max(qry() + curans, ans); } for (auto [x, i]:vec) { if (cost1[i] + cost2[i] == D) update(i, 4); else update(i, 2); } } return ans; }

Compilation message (stderr)

closing.cpp: In function 'long long int qry()':
closing.cpp:109:26: error: too many arguments to function 'long long int qry()'
  109 |     if ((qry1(l, 1) - qry(l-1, 1)) && state[u] == 2 && l + 1 <= sz && ord[l+1].id == u) {
      |                       ~~~^~~~~~~~
closing.cpp:101:5: note: declared here
  101 | int qry() {
      |     ^~~