QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#789023 | #114. Construction of Highway | _8_8_# | 0 | 2ms | 9740kb | C++23 | 3.4kb | 2024-11-27 19:05:10 | 2024-11-27 19:05:11 |
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = (int)1e5 + 12, MOD = (int)1e9 + 7;
int B = 18, p[N];
int n, c[N], sum = 0, up[N][18];
void make() {
vector<int> cl;
for(int i = 1; i <= n; i++) {
cl.push_back(c[i]);
}
sort(cl.begin(), cl.end());
cl.resize(unique(cl.begin(), cl.end()) - cl.begin());
for(int i = 1; i <= n; i++) {
c[i] = lower_bound(cl.begin(), cl.end(), c[i]) - cl.begin() + 1;
}
}
int t[N], a[N], b[N], tin[N], tout[N];
vector<int> g[N];
pair<int, int> s[N * 4];
void upd(int pos, pair<int, int> val, int v = 1, int tl = 1, int tr = n) {
if(tl == tr) {
s[v] = val;
} else {
int tm = (tl + tr) >> 1;
if(pos <= tm) upd(pos, val, v + v, tl, tm);
else upd(pos, val, v + v + 1, tm + 1, tr);
s[v] = max(s[v + v], s[v + v + 1]);
}
}
pair<int, int> get1(int l, int r, int v = 1, int tl = 1, int tr = n) {
if(l > r || tl > r || l > tr) return {0, 0};
if(tl >= l && tr <= r) return s[v];
int tm = (tl + tr) >> 1;
return max(get1(l, r, v + v, tl, tm), get1(l, r, v + v + 1, tm + 1, tr));
}
void add(int pos, int val) {
while(pos <= n) {
t[pos] += val;
pos += pos & -pos;
}
}
int get(int i) {
int ret = 0;
while(i) {
ret += t[i];
i -= i & -i;
}
return ret;
}
int get(int l, int r) {
return get(r) - get(l - 1);
}
void edge(int u, int v) {
up[v][0] = u;
g[u].push_back(v);
for(int i = 1; i < B; i++) {
up[v][i] = up[up[v][i - 1]][i - 1];
}
}
int timer = 0;
void dfs(int v) {
tin[v] = ++timer;
for(int to : g[v]) {
dfs(to);
}
tout[v] =timer;
}
bool is(int v, int u) {
return (tin[v] <= tin[u] && tout[v] >= tout[u]);
}
int f(int v) {
if(p[v] == v || !is(v, p[v])) return v;
return p[v] = f(p[v]);
}
bool vis[N];
void test() {
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> c[i];
p[i] = i;
}
make();
for(int i = 1; i <= n - 1; i++) {
cin >> a[i] >> b[i];
edge(a[i], b[i]);
}
dfs(1);
upd(tin[1],{0, c[1]});
for(int i = 1; i <= n - 1; i++) {
vector<pair<int, int>> x;
int v = a[i];
vis[b[i]] = 1;
vector<pair<int, int>> e;
e.emplace_back(a[i], b[i]);
while(v) {
int col = 1;
int val = f(v);
for(int i = B - 1; i >= 0; i--) {
int nv = up[v][i];
if(nv && f(nv) == val) {
v = nv;
col += (1 << i);
}
}
e.emplace_back(up[v][0], v);
x.push_back({c[val], col});
v = up[v][0];
}
for(auto [j, f]: e) {
p[j] = f;
}
reverse(x.begin(), x.end());
sum += (int)x.size();assert(sum <= 20 * n);
ll res = 0;
int m = (int)x.size();
for(auto [j, k] : x) {
res += get(j + 1, n) * 1ll * k;
add(j, k);
}
for(auto [j, k] : x) {
add(j, -k);
}
cout << res << '\n';
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int t = 1;
// cin >> t;
while(t--)
test();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 7
Accepted
time: 0ms
memory: 7612kb
input:
2 804289384 846930887 1 2
output:
0
result:
ok single line: '0'
Test #2:
score: 0
Wrong Answer
time: 2ms
memory: 9740kb
input:
10 505335291 738766720 190686789 260874576 747983062 906156499 502820865 142559278 261608746 380759628 1 3 1 5 5 7 3 8 1 4 3 10 7 6 5 9 5 2
output:
0 0 0 1 0 1 0 0 1
result:
wrong answer 9th lines differ - expected: '0', found: '1'
Subtask #2:
score: 0
Skipped
Dependency #1:
0%
Subtask #3:
score: 0
Skipped
Dependency #1:
0%