QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#717834 | #9492. 树上简单求和 | yaoyanfeng | 0 | 2344ms | 50560kb | C++14 | 3.4kb | 2024-11-06 19:04:34 | 2024-11-06 19:04:36 |
Judging History
answer
#include <bits/stdc++.h>
#define pii pair<int, int>
#define eb emplace_back
#define ull unsigned long long
using namespace std;
const int N = 200200, B = 470;
int n, m, s, t;
int p[N], q[N];
struct Tree{
vector<int> to[N];
int dfn[N], rnk[N], fa[N], nw, siz[N], son[N], top[N], dep[N];
void add(int u, int v) {
to[u].eb(v), to[v].eb(u);
}
void dfs1(int u, int dp) {
siz[u] = 1, dep[u] = dp;
for (int v : to[u]) if (v != fa[u]) {
fa[v] = u, dfs1(v, dp + 1);
if (!son[u] || siz[v] > siz[son[u]]) son[u] = v;
}
return;
}
void dfs2(int u, int tp) {
top[u] = tp, dfn[u] = ++nw, rnk[nw] = u;
if (son[u]) dfs2(son[u], tp);
else return;
for (int v : to[u]) if (v != fa[u] && v != son[u]) dfs2(v, v);
return;
}
vector<pii> qr(int u, int v) {
vector<pii> ans;
while (top[u] != top[v]) {
if (dep[top[u]] < dep[top[v]]) swap(u, v);
ans.emplace_back(dfn[top[u]], dfn[u]), u = fa[top[u]];
}
if (dep[u] < dep[v]) swap(u, v);
ans.emplace_back(dfn[v], dfn[u]);
return ans;
}
void solve() {
dfs1(1, 1), dfs2(1, 1);
}
} tr1, tr2;
ull a[N], k, add[B], ct[B], sm[B][B], bl[B], br[B], frm[N], ret[N];
// add是对整块的贡献,ret是散块对散块,ct是整块对散块
void init() {
for (int i = 1, x, y; i < n; ++i) scanf("%d%d", &x, &y), tr1.add(x, y);
for (int i = 1, x, y; i < n; ++i) scanf("%d%d", &x, &y), tr2.add(x, y);
tr1.solve(), tr2.solve();
for (int i = 1; i <= n; ++i) p[i] = tr2.dfn[tr1.rnk[i]], q[tr2.dfn[tr1.rnk[i]]] = i;
s = sqrt(n);
for (int i = 1, j = s; i <= n; i = j + 1, j = min(n, j + s)) {
bl[++t] = i, br[t] = j;
for (int k = i; k <= j; ++k) frm[k] = t;
}
for (int i = 1; i <= n; ++i) ++sm[frm[i]][frm[p[i]]];
for (int i = 1; i <= t; ++i) for (int j = 1; j <= t; ++j) sm[j][i] += sm[j - 1][i];
for (int i = 1; i <= n; ++i) ret[tr2.dfn[i]] = a[i], add[frm[tr2.dfn[i]]] += a[i];
return;
}
void modify(int l, int r, ull x) {
if (frm[l] == frm[r]) {
for (int i = l; i <= r; ++i) ret[p[i]] += x, add[frm[p[i]]] += x;
return;
}
int L = frm[l], R = frm[r];
for (int i = l; i <= br[L]; ++i) ret[p[i]] += x, add[frm[p[i]]] += x;
for (int i = bl[R]; i <= r; ++i) ret[p[i]] += x, add[frm[p[i]]] += x;
for (int i = L + 1; i < R; ++i) ct[i] += x;
for (int i = 1; i <= t; ++i) add[i] += (sm[R - 1][i] - sm[L][i]) * x;
return;
}
ull query(int l, int r) {
ull ans = 0;
if (frm[l] == frm[r]) {
for (int i = l; i <= r; ++i) ans += ret[i] + ct[q[i]];
return ans;
}
int L = frm[l], R = frm[r];
for (int i = l; i <= br[L]; ++i) ans += ret[i] + ct[q[i]];
for (int i = bl[R]; i <= r; ++i) ans += ret[i] + ct[q[i]];
for (int i = L + 1; i < R; ++i) ans += add[i];
return ans;
}
void solve(int x, int y, ull k) {
vector<pii> o = tr1.qr(x, y);
for (pii r : o) modify(r.first, r.second, k);
ull ans = 0;
o = tr2.qr(x, y);
for (pii r : o) ans += query(r.first, r.second);
printf("%llu\n", ans);
return;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) scanf("%llu", a + i);
init();
for (int i = 1, x, y; i <= m; ++i) scanf("%d%d%llu", &x, &y, &k), solve(x, y, k);
return 0;
}
詳細信息
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 7ms
memory: 30712kb
input:
3000 3000 7236742292501328495 17973811477309806363 16075782662531676171 17971236571771878676 11392080645527132110 3685563455925680459 9773593720088356683 8313828403245053795 7736401634567449043 1634817828009987181 6951124933529719486 12775126714635387213 15460977209223753216 397573676785925632 31372...
output:
1951973837003263495 11991165726498690321 16571119821463249065 14002622959079798327 14250522181366488008 18357467074943635134 15744985683890171914 13718260995413642509 4818074018151576254 99130001568914473 595277408587977254 9880818433099558390 17411587481588405383 380373508032723806 5811064100311931...
result:
wrong answer 1st lines differ - expected: '12105153858659381124', found: '1951973837003263495'
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: 2344ms
memory: 45020kb
input:
200000 200000 622783158027686223 2242697872372232537 8481648430436878777 10092474834140799044 15403999682625301609 12614289513474949582 9180944589267018841 7823784919308285798 8257785171198951273 5134508521895120821 8041682272181381093 3835432206618893170 2653803171409877650 5589823419153460372 1007...
output:
17707393286504735245 5290615354901163662 1290216178434170637 13060617549863753249 3697750434948541007 11927371105411290731 1585803769297764143 9847992223619826842 2978618486687088066 13847806247385889235 9957913215768701814 8701120066272324609 17745639329481677609 7668131909668395013 960879939272908...
result:
wrong answer 1st lines differ - expected: '9042998055336671259', found: '17707393286504735245'
Subtask #5:
score: 0
Wrong Answer
Test #27:
score: 0
Wrong Answer
time: 975ms
memory: 50560kb
input:
200000 200000 1958469220619413759 14991498002015735322 6054491201406941902 18206143187746582567 15082377615826460430 2936248617457291604 10073577150351675920 16534472678586906457 2207599132486246393 10301540360769075442 1492580560381080472 551692353431379140 13238280352539145808 8462626987240986565 ...
output:
16547698063633522446 10047149696913128124 3459245601784578386 10078064210327675223 558898553084926773 17948179622326761441 1985336561624381957 10116124196617588763 327039839599795497 3571260347265966727 16450862567534828625 876200040196262382 5516240570354751520 15397515976767902046 1057773254304280...
result:
wrong answer 1st lines differ - expected: '11479812171669345085', found: '16547698063633522446'
Subtask #6:
score: 0
Time Limit Exceeded
Test #34:
score: 0
Time Limit Exceeded
input:
200000 200000 6794776813641982926 1561596256197101737 10910039723053043515 7892247858295192798 12233819960547881004 17695389034783066733 9173201689566865598 17626618141377486739 7358781671024283919 6787559733384974662 3884392438269280436 14872846228351316833 9037842441501571648 14299818404271084016 ...
output:
16951287400765938581 7501136194536093726 11612857230418130656 10656930546991139833 10093328260662965760 15877089058747273212 18066938768145158357 915469228465024712 17483835668530300655 10120504043558134890 590383446038432217 16273925320652411488 4951388883507522738 3749952172638236822 5661752393808...
result:
Subtask #7:
score: 0
Skipped
Dependency #1:
0%