QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#292413 | #7118. Closing Time | training4usaco | Compile Error | / | / | C++20 | 4.0kb | 2023-12-28 04:24:15 | 2024-04-28 08:03:22 |
Judging History
你现在查看的是最新测评结果
- [2024-04-28 08:03:22]
- 管理员手动重测本题所有提交记录
- 测评结果:Compile Error
- 用时:0ms
- 内存:0kb
- [2023-12-28 04:24:15]
- 评测
- 测评结果:Compile Error
- 用时:0ms
- 内存:0kb
- [2023-12-28 04:24:15]
- 提交
answer
#include <iostream>
#include <vector>
using namespace std;
#define int long long
#define pii pair<int, int>
#define all(v) v.begin(), v.end()
#define ff first
#define ss second
const int MAXN = 2e5 + 5;
const int MAXM = 4e6 + 5; // implicit segtree
int dist[MAXN][2];
int a[MAXN], b[MAXN]; // 2 costs
int ans, ans2; // no overlap, overlap
vector<pii> adj[MAXN];
vector<int> vals;
int have;
int tot = 1;
int val[MAXM], cnt[MAXM];
int lc[MAXM], rc[MAXM];
void pull(int u) {
val[u] = val[lc[u]] + val[rc[u]];
cnt[u] = cnt[lc[u]] + cnt[rc[u]];
}
void ins(int u, int l, int r, int pos, int freq) { // segtree indexed by val so pos = val
if(l == r) {
// cout << "updating with " << pos << " " << freq << endl;
val[u] += pos * freq;
cnt[u] += freq;
return;
}
int mid = (l + r) / 2;
if(pos <= mid) {
if(lc[u] == 0) lc[u] = ++tot;
ins(lc[u], l, mid, pos, freq);
}
else {
if(rc[u] == 0) rc[u] = ++tot;
ins(rc[u], mid + 1, r, pos, freq);
}
pull(u);
}
int walk(int u, int l, int r) {
if(u == 0) return 0;
// cout << u << " " << l << " " << r << " " << val[u] << " " << cnt[u] << endl;
if(l == r) {
// cout << cnt[u] << " " << have << " " << l << endl;
int sub = min(cnt[u], have / l);
have -= l * sub;
// cout << "returning " << sub << endl;
return sub;
}
int mid = (l + r) / 2;
int ret = 0;
if(val[lc[u]] > have) return walk(lc[u], l, mid);
// cout << "left val: " << val[lc[u]] << " node, lc: " << u << " " << lc[u] << endl;
have -= val[lc[u]];
if(have) return cnt[lc[u]] + walk(rc[u], mid + 1, r);
return cnt[lc[u]];
}
void dfs(int u, int p, int type) {
for(auto [v, w] : adj[u]) {
if(v == p) continue;
dist[v][type] = dist[u][type] + w;
dfs(v, u, type);
}
}
int max_score(int n, int x, int y, int k, vector<int> u, vector<int> v, vector<int> w) {
for(int i = 0; i < n - 1; ++i) {
adj[u[i]].push_back({v[i], w[i]});
adj[v[i]].push_back({u[i], w[i]});
}
dfs(x, -1, 0); dfs(y, -1, 1);
for(int i = 0; i < n; ++i) {
a[i] = min(dist[i][0], dist[i][1]);
b[i] = max(dist[i][0], dist[i][1]);
}
// seperate
vector<int> sortedDists;
for(int i = 0; i < n; ++i) {
sortedDists.push_back(dist[i][0]); sortedDists.push_back(dist[i][1]);
}
sort(all(sortedDists));
int tot = k;
for(auto val : sortedDists) {
if(tot >= val) {
++ans; tot -= val;
}
else break;
}
// overlap
bool flag = false;
int distXY = dist[y][0]; // dist between x,y
// cout << "dist between x,y: " << distXY << endl;
for(int i = 0; i < n; ++i) {
if(dist[i][0] + dist[i][1] == distXY) { // on the path
// cout << "node " << i << " is on path" << endl;
k -= a[i]; ++ans2; // forced
if(k < 0) flag = true;
ins(1, 0, MAXM, b[i] - a[i], 1);
// cout << "need " << b[i] - a[i] << " to turn to 2" << endl;
}
else {
ins(1, 0, MAXM, a[i], 1);
// cout << "need " << a[i] << " for extra" << endl;
}
}
// cout << "total val of tree: " << val[1] << endl;
//
// cout << "forced overlap: " << ans2 << endl;
// cout << "have " << k << " left " << endl;
have = k;
// cout << "have: " << have << endl;
ans2 += walk(1, 0, MAXM);
// cout << "total overlap ans: " << ans2 << endl;
if(flag) ans2 = 0;
return max(ans, ans2);
}
signed main() {
int n, x, y, k; cin >> n >> x >> y >> k;
vector<int> u(n - 1), v(n - 1), w(n - 1);
for(int i = 0; i < n - 1; ++i) cin >> u[i];
for(int i = 0; i < n - 1; ++i) cin >> v[i];
for(int i = 0; i < n - 1; ++i) cin >> w[i];
cout << max_score(n, x, y, k, u, v, w) << endl;
}
Details
answer.code: In function ‘long long int max_score(long long int, long long int, long long int, long long int, std::vector<long long int>, std::vector<long long int>, std::vector<long long int>)’: answer.code:101:5: error: ‘sort’ was not declared in this scope; did you mean ‘short’? 101 | sort(all(sortedDists)); | ^~~~ | short