QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#666245 | #9492. 树上简单求和 | Galex | Compile Error | / | / | C++23 | 4.6kb | 2024-10-22 17:19:06 | 2024-10-22 17:19:07 |
Judging History
This is the latest submission verdict.
- [2024-10-22 17:19:07]
- Judged
- Verdict: Compile Error
- Time: 0ms
- Memory: 0kb
- [2024-10-22 17:19:06]
- Submitted
answer
#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define pii pair<int, int>
#define pll pair<LL, LL>
#define fi first
#define se second
#define mkp make_pair
#define sz(x) (int)x.size()
using namespace std;
bool Mst;
LL read() {
LL s = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
f = (ch == '-' ? -1 : 1), ch = getchar();
while (ch >= '0' && ch <= '9')
s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
return s * f;
}
ULL readull() {
ULL s = 0; char ch = getchar();
while (ch < '0' || ch > '9') ch = getchar();
while (ch >= '0' && ch <= '9') s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
return s;
}
mt19937 rnd(time(NULL));
const int MAXN = 200005;
int n, m;
ULL a[MAXN];
vector<int> e[MAXN];
int fa[MAXN][20], dep[MAXN];
int dfn[MAXN], tim = 0, rnk[MAXN];
void pre(int x, int fat) {
fa[x][0] = fat, dep[x] = dep[fat] + 1;
dfn[x] = ++tim, rnk[tim] = x, sz[x] = 1;
for (int y : e[x])
if (y != fat)
pre(y, x), sz[x] += sz[y];
}
int mov(int u, int d) {
for (int i = 18; i >= 0; i--)
if ((1 << i) <= d)
d -= (1 << i), u = fa[u][i];
return u;
}
int lca(int u, int v) {
dep[u] > dep[v] ? u = mov(u, dep[u] - dep[v]) : v = mov(v, dep[v] - dep[u]);
if (u == v) return u;
for (int i = 18; i >= 0; i--)
if (fa[u][i] != fa[v][i])
u = fa[u][i], v = fa[v][i];
return fa[u][0];
}
namespace Blocker {
const int MAXC = 505;
int B, C;
int L[MAXC], R[MAXC], bl[MAXN];
ULL sum[MAXC], val[MAXN];
void init() {
B = sqrt(n), C = (n - 1) / B + 1;
for (int i = 1; i <= n; i++)
bl[i] = (i - 1) / B + 1, R[bl[i]] = i;
for (int i = n; i; i--)
L[bl[i]] = i;
}
void mdf(int x, ULL v) {
sum[bl[x]] += v, val[x] += v;
}
ULL qry(int l, int r) {
if (bl[l] == bl[r]) {
ULL ans = 0;
for (int i = l; i <= r; i++) ans += sum[i];
return ans;
}
ULL ans = 0;
for (int i = l; i <= R[bl[l]]; i++) ans += val[i];
for (int i = L[bl[r]]; i <= r; i++) ans += val[i];
for (int i = bl[l] + 1; i < bl[r]; i++) ans += sum[i];
return ans;
}
}
namespace Tree1 {
vector<int> e[MAXN];
void add(int u, int v) {
e[u].push_back(v);
e[v].push_back(u);
}
int fa[MAXN][20], dep[MAXN], dfn[MAXN], rnk[MAXN], tim = 0, sz[MAXN];
void pre(int x, int fat) {
dfn[x] = ++tim, rnk[tim] = x, sz[x] = 1;
fa[x][0] = fat, dep[x] = dep[fat] + 1;
for (int y : e[x])
if (y != fat)
pre(y, x), sz[x] += sz[y];
}
int mov(int u, int d) {
for (int i = 18; i >= 0; i--)
if ((1 << i) <= d)
d -= (1 << i), u = fa[u][i];
return u;
}
int lca(int u, int v) {
dep[u] > dep[v] ? u = mov(u, dep[u] - dep[v]) : v = mov(v, dep[v] - dep[u]);
if (u == v) return u;
for (int i = 18; i >= 0; i--)
if (fa[u][i] != fa[v][i])
u = fa[u][i], v = fa[v][i];
return fa[u][0];
}
void pre() {
pre(1, 0);
for (int j = 1; j <= 18; j++)
for (int i = 1; i <= n; i++)
fa[i][j] = fa[fa[i][j - 1]][j - 1];
}
void mdf(int x, int y, int l, ULL k) {
Blocker::mdf(dfn[x], k), Blocker::mdf(dfn[y], k);
Blocker::mdf(dfn[l], -k), Blocker::mdf(fa[dfn[l]][0], -k);
}
ULL qry(int x) {
return Blocker::qry(dfn[x], dfn[x] + sz[x] - 1);
}
}
int p[MAXN], cnt = 0;
bool in[MAXN];
void spread() {
cnt = 300;
for (int i = 1; i <= cnt; i++) p[i] = rnd() % n + 1; p[++cnt] = 1;
sort(p + 1, p + cnt + 1, [](int x, int y) {return dfn[x] < dfn[y];});
for (int i = 2, len = cnt; i <= len; i++) p[++cnt] = lca(p[i], p[i - 1]);
sort(p + 1, p + cnt + 1, [](int x, int y) {return dfn[x] < dfn[y];});
cnt = unique(p + 1, p + cnt + 1) - p - 1;
for (int i = 1; i <= cnt; i++) in[p[i]] = 1;
}
int x[MAXN], y[MAXN], l1[MAXN];
int p1[MAXN], p2[MAXN], p3[MAXN];
ULL ans[MAXN], k[MAXN];
int qry(int u, int i, ULL v) {
while (!in[u]) {
ans[i] += v * Tree2
}
}
bool Med;
signed main() {
fprintf(stderr, "%.2lfMB\n", abs(&Med - &Mst) / 1048576.0);
n = read(), m = read();
for (int i = 1; i <= n; i++) a[i] = readull();
for (int i = 1; i < n; i++) {
int u = read(), v = read();
Tree1::add(u, v);
}
for (int i = 1; i < n; i++) {
int u = read(), v = read();
e[u].push_back(v), e[v].push_back(u);
}
pre(1, 0), Tree1::pre();
for (int j = 1; j <= 18; j++)
for (int i = 1; i <= n; i++)
fa[i][j] = fa[fa[i][j - 1]][j - 1];
Blocker::init();
for (int i = 1; i <= m; i++) {
x[i] = read(), y[i] = read(), k[i] = readull(), l1[i] = Tree1::lca(x[i], y[i]);
Tree1::mdf(x[i], y[i], l1[i], k[i]), p1[i] = qry(x[i], i, 1), p2[i] = qry(y[i], i, 1);
int l = lca(x[i], y[i]);
p3[i] = qry(l, i, -2), ans[i] += Tree1::qry(l);
}
return 0;
}
詳細信息
answer.code: In function ‘void pre(int, int)’: answer.code:42:39: error: ‘sz’ was not declared in this scope 42 | dfn[x] = ++tim, rnk[tim] = x, sz[x] = 1; | ^~ answer.code: In function ‘int qry(int, int, long long unsigned int)’: answer.code:155:31: error: ‘Tree2’ was not declared in this scope; did you mean ‘Tree1’? 155 | ans[i] += v * Tree2 | ^~~~~ | Tree1 answer.code:157:1: warning: no return statement in function returning non-void [-Wreturn-type] 157 | } | ^