QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#690282 | #9492. 树上简单求和 | dieselhuang | 0 | 2897ms | 64068kb | C++14 | 3.7kb | 2024-10-30 21:25:42 | 2024-10-30 21:25:43 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
int n, m, B;
int dfx = 0, dfn[200010], rnk[200010], siz[200010], c[200010];
ull a[200010], ans[200010], f[200010], tg[510];
struct Tree{
int hd[200010], e[400010][2], fa[200010], dep[200010], Fa[200010][19];
int b[200010];
void dfs1(int u){
int i, v;
for(i = 1, Fa[u][0] = fa[u]; i <= 18; i++) Fa[u][i] = Fa[Fa[u][i - 1]][i - 1];
for(i = hd[u]; i > 0; i = e[i][0]){
v = e[i][1];
if(v != fa[u]){
fa[v] = u; dep[v] = dep[u] + 1; dfs1(v);
}
}
}
void dfs2(int u){
dfn[u] = ++dfx; rnk[dfx] = u; siz[u] = 1;
int i, v;
for(i = hd[u]; i > 0; i = e[i][0]){
v = e[i][1];
if(v != fa[u]){
dfs2(v);
siz[u] += siz[v];
}
}
}
void dfs4(int u, int x){
b[u] = x;
int i, v;
for(i = hd[u]; i > 0; i = e[i][0]){
v = e[i][1];
if(v != fa[u] && b[v] == 0) dfs4(v, x);
}
}
int dfs3(int u){
int i, v, x = 0;
for(i = hd[u]; i > 0; i = e[i][0]){
v = e[i][1];
if(v != fa[u]){
x = max(x, dfs3(v) + 1);
}
}
if(x >= B || u == 1){ dfs4(u, u); return -1; }
else return x;
}
void dfs5(int u){
int i, v;
for(i = hd[u]; i > 0; i = e[i][0]){
v = e[i][1];
if(v != fa[u]){
c[v] += c[u]; dfs5(v);
}
}
}
void init(bool fl){
int i, u, v;
for(i = 1; i <= n; i++) hd[i] = 0, b[i] = 0;
for(i = 1; i >> 1 < n - 1; i++){
scanf("%d%d", &u, &v);
e[i][0] = hd[u]; e[i][1] = v; hd[u] = i;
i++;
e[i][0] = hd[v]; e[i][1] = u; hd[v] = i;
}
fa[1] = 1; dep[1] = 0; dfs1(1);
if(fl){
for(i = 1; i <= n; i++) b[i] = (i + B - 1) / B;
}
}
int lca(int u, int v){
if(dep[u] < dep[v]) swap(u, v);
int i, j = dep[u] - dep[v];
for(i = 0; 1 << i <= j; i++){
if(j >> i & 1) u = Fa[u][i];
}
if(u == v) return u;
for(i = 18; i >= 0; i--){
if(Fa[u][i] != Fa[v][i]) u = Fa[u][i], v = Fa[v][i];
}
return fa[u];
}
} T1, T2;
int qry2(int x){ return (x > 0 ? f[x] + tg[T1.b[x]] : 0); }
int qry(int u){ return qry2(dfn[u] + siz[u] - 1) - qry2(dfn[u] - 1); }
void upd(int u, ull x){
u = dfn[u];
int i;
for(i = u; i <= n && T1.b[i] == T1.b[u]; i++) f[i] += x;
for(i = T1.b[u] + 1; i <= T1.b[n]; i++) tg[i] += x;
}
ull calc(int u){
ull res = 0;
while(u != T2.b[u]){
res += qry(u); u = T2.fa[u];
}
return res;
}
struct Node{
int u, v, w1, w2; ull k;
} q[200010];
int main()
{
int i, j, u, v, w;
ull x;
scanf("%d%d", &n, &m); B = sqrt(n);
for(i = 1; i <= n; i++){
scanf("%llu", &a[i]); f[i] = 0;
}
T1.init(1); T2.init(0);
T1.dfs2(1); T2.dfs3(1);
for(i = 1; i <= m; i++){
scanf("%d%d%llu", &q[i].u, &q[i].v, &q[i].k); ans[i] = 0;
q[i].w1 = T1.lca(q[i].u, q[i].v); q[i].w2 = T2.lca(q[i].u, q[i].v);
}
for(i = 1; i <= n; i++){
if(T2.b[i] == i){
x = 0;
for(u = 1; u <= n; u++) c[u] = 0;
for(u = i; 1; u = T2.fa[u]){
c[u]++; x += a[u];
if(u == 1) break;
}
T1.dfs5(1);
for(j = 1; j <= m; j++){
u = q[j].u; v = q[j].v; w = q[j].w1;
x += (c[u] + c[v] - c[w] - (w > 1 ? c[T1.fa[w]] : 0)) * q[j].k;
w = q[j].w2;
if(i == T2.b[u]) ans[j] += x;
if(i == T2.b[v]) ans[j] += x;
if(i == T2.b[w]) ans[j] -= x;
if(w > 1 && i == T2.b[T2.fa[w]]) ans[j] -= x;
}
}
}
for(i = 1; i <= T1.b[n]; i++) tg[i] = 0;
for(i = 1; i <= n; i++){
upd(i, a[i]);
if(i > 1) upd(T1.fa[i], -a[i]);
}
for(i = 1; i <= m; i++){
u = q[i].u; v = q[i].v; w = q[i].w1; x = q[i].k;
upd(u, x); upd(v, x); upd(w, -x);
if(w > 1) upd(T1.fa[w], -x);
w = q[i].w2;
ans[i] += calc(u) + calc(v) - calc(w) - (w > 1 ? calc(T2.fa[w]) : 0llu);
printf("%llu\n", ans[i]);
}
return 0;
}
详细
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 8ms
memory: 26472kb
input:
3000 3000 7236742292501328495 17973811477309806363 16075782662531676171 17971236571771878676 11392080645527132110 3685563455925680459 9773593720088356683 8313828403245053795 7736401634567449043 1634817828009987181 6951124933529719486 12775126714635387213 15460977209223753216 397573676785925632 31372...
output:
18213677769774559108 17093949732820879813 6110234250561971030 6110234228423663688 1330905225009004758 11074110175631365991 8433723884804489525 11723819164747508792 2350619461296926746 4061418469493211354 2350619469274930855 2350619475661824409 12622461363894560980 18446744073567209572 18298806766670...
result:
wrong answer 1st lines differ - expected: '12105153858659381124', found: '18213677769774559108'
Subtask #2:
score: 0
Skipped
Dependency #1:
0%
Subtask #3:
score: 0
Skipped
Dependency #2:
0%
Subtask #4:
score: 0
Wrong Answer
Test #21:
score: 0
Wrong Answer
time: 1426ms
memory: 58872kb
input:
200000 200000 622783158027686223 2242697872372232537 8481648430436878777 10092474834140799044 15403999682625301609 12614289513474949582 9180944589267018841 7823784919308285798 8257785171198951273 5134508521895120821 8041682272181381093 3835432206618893170 2653803171409877650 5589823419153460372 1007...
output:
5992130163325007899 15788779831852462006 5992130156728352042 6740920874893153742 18446744050101345185 6740920858806597237 6752936956096127136 18446744068888736763 14379797934398346571 19356463153 15706774571095152241 15350898835381430140 4238848451990875552 6558621449428044457 28539808038 6558621414...
result:
wrong answer 1st lines differ - expected: '9042998055336671259', found: '5992130163325007899'
Subtask #5:
score: 0
Time Limit Exceeded
Test #27:
score: 0
Time Limit Exceeded
input:
200000 200000 1958469220619413759 14991498002015735322 6054491201406941902 18206143187746582567 15082377615826460430 2936248617457291604 10073577150351675920 16534472678586906457 2207599132486246393 10301540360769075442 1492580560381080472 551692353431379140 13238280352539145808 8462626987240986565 ...
output:
12443773617971303229 17958613905992277634 10844063474478471115 1596102579398339954 5898414357963520549 8723621788247717768 5389285892797269859 10465985597189066040 443898306555964067 8745373126383700524 14784395955507208613 10287438334892623361 12977874567624650582 16380308455126745954 5098578956645...
result:
Subtask #6:
score: 0
Wrong Answer
Test #34:
score: 0
Wrong Answer
time: 2897ms
memory: 64068kb
input:
200000 200000 6794776813641982926 1561596256197101737 10910039723053043515 7892247858295192798 12233819960547881004 17695389034783066733 9173201689566865598 17626618141377486739 7358781671024283919 6787559733384974662 3884392438269280436 14872846228351316833 9037842441501571648 14299818404271084016 ...
output:
1370573908951975329 7153661384656771363 17475059586371309861 13997910247847513485 12660536706123999875 14361768362401820099 16570665247875482874 1993432124531586127 7119560896192262864 7155027614797542047 14959367101851052309 5404761479915667951 4004205354693387280 7764333739647442641 17792450473835...
result:
wrong answer 1st lines differ - expected: '5519324519442957729', found: '1370573908951975329'
Subtask #7:
score: 0
Skipped
Dependency #1:
0%