QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#717834#9492. 树上简单求和yaoyanfeng0 2344ms50560kbC++143.4kb2024-11-06 19:04:342024-11-06 19:04:36

Judging History

This is the latest submission verdict.

  • [2024-11-06 19:04:36]
  • Judged
  • Verdict: 0
  • Time: 2344ms
  • Memory: 50560kb
  • [2024-11-06 19:04:34]
  • Submitted

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%