Logo Wy Online Judge

WyOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#453#85. 「NOIP2018」保卫王国ryp1002911ms41624kbC++145.5kb2025-04-24 13:51:132025-04-24 13:51:14

answer


#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <cstdlib>

#include <algorithm>
#include <numeric>
#include <limits>
#include <functional>
#include <stack>
#include <vector>
#include <set>
#include <map>
#include <queue>

#define LOG(FMT...) fprintf(stderr, FMT)

using namespace std;

typedef long long ll;
typedef unsigned long long ull;

struct Edge {
    int v;
    Edge *next;
};

ll ad(ll x, ll y) {
    if (~x & ~y)
        return x + y;
    return -1;
}

bool cmp(ll x, ll y) {
    return x != -1 && (x < y || y == -1);
}

struct Mat {
    ll gr[2][2];

    Mat() { memset(gr, -1, sizeof(gr)); }

    Mat(const Mat& rhs) { memcpy(gr, rhs.gr, sizeof(gr)); }

    ll* operator[](int k) { return gr[k]; }
    const ll* operator[](int k) const { return gr[k]; }

    void dbg() const {
        for(int i = 0; i < 2; ++i) {
            for(int j = 0; j < 2; ++j) {
                LOG("%lld ", gr[i][j]);
            }
            LOG("\n");
        }
    }

    Mat operator*(const Mat& rhs) const {
        Mat m = Mat();
        for (int i = 0; i < 2; ++i)
            for (int j = 0; j < 2; ++j) {
                for (int k = 0; k < 2; ++k)
                    m[i][j] = min(m[i][j], ad(gr[i][k], rhs.gr[k][j]), cmp);
            }
//		dbg();
//		rhs.dbg();
//		m.dbg();
        return m;
    }
};

const int N = 100010;

int n, m;
char s[5];
bool vis[N];
int p[N], f[N], qa[N], qx[N], qb[N], qy[N], lca[N];
Mat dt[N];
ll ans[N];
ll dp[N][2], tmp[N][2];
Edge* g[N];
vector<pair<int, int> > ql[N];
vector<int> qr[N];

int find(int x) { return f[x] == x ? x : f[x] = find(f[x]); }

int find2(int x) {
    if (f[x] == x)
        return x;
    int prt = f[x];
    f[x] = find2(prt);
    dt[x] = dt[prt] * dt[x];
    return f[x];
}

void adde(int u, int v);
void tarjan(int u);
void dfs(int u);

int main() {
#ifndef ONLINE_JUDGE
    freopen("test.in", "r", stdin);
    int nol_cl = clock();
#endif

    scanf("%d%d%s", &n, &m, s);
    for (int i = 1; i <= n; ++i)
        scanf("%d", &p[i]);
    for (int rep = 1; rep < n; ++rep) {
        int u, v;
        scanf("%d%d", &u, &v);
        adde(u, v);
        adde(v, u);
    }
    for (int i = 1; i <= m; ++i) {
        scanf("%d%d%d%d", &qa[i], &qx[i], &qb[i], &qy[i]);
        ql[qa[i]].push_back(make_pair(qb[i], i));
        ql[qb[i]].push_back(make_pair(qa[i], i));
    }
    tarjan(1);
    for (int i = 1; i <= m; ++i)
        qr[lca[i]].push_back(i);
    memset(vis, 0, sizeof(vis));
    memset(f, 0, sizeof(f));
    {
        Mat model = Mat();
        model[0][0] = model[1][1] = 0;
        fill(dt + 1, dt + n + 1, model);
    }
    dfs(1);
    for (int i = 1; i <= m; ++i) {
        int lc = lca[i];
        find2(lc);
        ans[i] = -1;
//		LOG("%d: %lld %lld\n", i, tmp[i][0], tmp[i][1]);;
        for (int k = 0; k < 2; ++k)
            for (int j = 0; j < 2; ++j)
                ans[i] = min(ans[i], ad(dt[lc][k][j], tmp[i][j]), cmp);
        printf("%lld\n", ans[i]);
    }

#ifndef ONLINE_JUDGE
    LOG("Time: %dms\n", int((clock() - nol_cl) / (double)CLOCKS_PER_SEC * 1000));
#endif
    return 0;
}

void dfs(int u) {
    vis[u] = true;
    f[u] = u;
    dp[u][1] = p[u];
    for (Edge* p = g[u]; p; p = p->next)
        if (!vis[p->v]) {
            dfs(p->v);
            dp[u][0] += dp[p->v][1];
            dp[u][1] += min(dp[p->v][0], dp[p->v][1]);
        }
    for (int i = 0; i < qr[u].size(); ++i) {
        int id = qr[u][i];
        int &a = qa[id], &x = qx[id], &b = qb[id], &y = qy[id];
        if (u == b) {
            swap(a, b);
            swap(x, y);
        }
        if (u != a) {
            find2(a);
            find2(b);
            for (int k = 0; k < 2; ++k) {
                tmp[id][k] = -1;
                ll sub = dp[u][k];
                if (k == 0)
                    sub -= dp[f[a]][1] + dp[f[b]][1];
                else
                    sub -= min(dp[f[a]][0], dp[f[a]][1]) + min(dp[f[b]][0], dp[f[b]][1]);

                if (k == 0)
                    tmp[id][0] = ad(dp[a][x] + dp[b][y], ad(sub, ad(dt[a][1][x], dt[b][1][y])));
                else
                    tmp[id][1] = ad(dp[a][x] + dp[b][y] + sub, ad(min(dt[a][1][x], dt[a][0][x], cmp), min(dt[b][1][y], dt[b][0][y], cmp)));
            }
        }
    }
    for (Edge* p = g[u]; p; p = p->next)
        if (!vis[p->v]) {
            f[p->v] = u;
            dt[p->v][0][0] = -1;
            dt[p->v][0][1] = dp[u][0] - dp[p->v][1];
            dt[p->v][1][0] = dt[p->v][1][1] = dp[u][1] - min(dp[p->v][0], dp[p->v][1]);
        }
    for (int i = 0; i < qr[u].size(); ++i) {
        int id = qr[u][i];
        int a = qa[id], x = qx[id], b = qb[id], y = qy[id];
        if (u == a) {
            find2(b);
//			LOG("%d(from %d)%d %d\n", f[b], b, f[f[b]], u);
            tmp[id][x] = ad(dt[b][x][y], dp[b][y]);
//			LOG("%lld\n", dt[b][x][y]);
            tmp[id][!x] = -1;
        }
    }
    vis[u] = false;
}

void tarjan(int u) {
    static bool vis[N];
    vis[u] = true;
    f[u] = u;
    for (Edge* p = g[u]; p; p = p->next)
        if (!vis[p->v]) {
            tarjan(p->v);
            f[p->v] = u;
        }
    for (int i = 0; i < ql[u].size(); ++i)
        if (f[ql[u][i].first])
            lca[ql[u][i].second] = find(ql[u][i].first);
}

void adde(int u, int v) {
    static Edge pool[N * 2];
    static Edge* p = pool;
    p->v = v;
    p->next = g[u];
    g[u] = p;
    ++p;
}

详细

小提示:点击横条可展开更详细的信息

Test #1:

score: 4
Accepted
time: 1ms
memory: 16776kb

input:

10 10 A3
63506 94509 47931 36299 43399 72971 71326 26897 33860 49557
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9...

output:

302616
260022
264536
264536
260022
260022
280233
260022
308965
260022

result:

ok 10 tokens

Test #2:

score: 4
Accepted
time: 3ms
memory: 17172kb

input:

10 10 A3
76660 70069 93798 89578 65296 77676 39212 94829 27329 87909
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9...

output:

303864
420061
380524
379393
302295
420061
379393
-1
397124
291484

result:

ok 10 tokens

Test #3:

score: 4
Accepted
time: 0ms
memory: 16328kb

input:

10 10 C3
89815 45628 39661 42853 87193 82381 7097 62758 20798 26257
2 1
3 1
4 1
5 4
6 3
7 6
8 6
9 7
...

output:

224254
218795
231321
280187
218795
238418
292743
292743
292743
231321

result:

ok 10 tokens

Test #4:

score: 4
Accepted
time: 2ms
memory: 17300kb

input:

10 10 C3
2965 21188 85527 96131 9086 87085 74986 30686 14267 64609
2 1
3 1
4 1
5 2
6 3
7 4
8 6
9 6
1...

output:

282126
225953
320617
238662
216910
238731
217517
252998
229619
217517

result:

ok 10 tokens

Test #5:

score: 4
Accepted
time: 5ms
memory: 16492kb

input:

100 100 A3
29274 72311 77257 2681 52879 96494 10756 66547 1205 41308 29018 71254 9864 68500 23973 93...

output:

1968725
2109802
1947500
2030928
1986270
2046906
2008159
2053710
2117956
1947500
1989327
1987134
1958...

result:

ok 100 tokens

Test #6:

score: 4
Accepted
time: 3ms
memory: 16636kb

input:

100 100 A3
42428 47871 23120 55960 74776 1195 78645 34475 94678 79660 80961 54350 13321 73846 76945 ...

output:

2130259
2042004
2218645
2107260
2055793
2059681
2042004
2130259
2113171
2171255
2044635
2071597
2129...

result:

ok 100 tokens

Test #7:

score: 4
Accepted
time: 2ms
memory: 16372kb

input:

100 100 C3
55582 23430 68987 9235 96673 5900 46531 2404 88147 18008 32901 37446 16779 79193 29913 27...

output:

1535240
1579038
1535240
1535240
1535240
1555070
1770122
1582046
1669212
1535240
1535240
1566802
1591...

result:

ok 100 tokens

Test #8:

score: 4
Accepted
time: 6ms
memory: 17136kb

input:

2000 2000 A3
68736 98994 14850 62514 18566 10604 14416 70336 81616 56359 84845 20542 20236 84539 828...

output:

40622025
40653695
40652286
40642946
40680346
40623425
40777137
40636817
40680770
40635434
40630127
4...

result:

ok 2000 tokens

Test #9:

score: 4
Accepted
time: 13ms
memory: 17604kb

input:

2000 2000 A3
81891 74553 60717 15789 40462 15309 82305 38264 75085 94711 36784 3637 23693 89885 3585...

output:

41550791
41489330
41550424
41484187
41566526
41611054
41596221
41484187
41526929
41546693
41506738
4...

result:

ok 2000 tokens

Test #10:

score: 4
Accepted
time: 12ms
memory: 16780kb

input:

2000 2000 C3
95045 50113 6580 69067 62359 20014 50190 6193 68554 33059 88728 86737 27151 95232 88826...

output:

33320143
33361265
33392690
33344461
33388020
33320143
33327872
33328722
33357908
33320143
33320143
3...

result:

ok 2000 tokens

Test #11:

score: 4
Accepted
time: 10ms
memory: 16596kb

input:

2000 2000 C3
8195 25672 52446 22342 84256 24718 18075 74125 62023 71410 40668 69833 30608 574 41794 ...

output:

32949293
32930769
32903180
32958740
32903180
32997858
33004297
32903180
32918433
32981668
32922245
3...

result:

ok 2000 tokens

Test #12:

score: 4
Accepted
time: 159ms
memory: 39828kb

input:

100000 100000 A1
21350 1232 98313 75621 6149 29423 85965 42053 55492 9758 92612 52929 34065 5921 947...

output:

2072566246
2072578780
2072599127
2072566246
2072566246
2072566246
2072571189
2072595651
2072578155
2...

result:

ok 100000 tokens

Test #13:

score: 4
Accepted
time: 171ms
memory: 39884kb

input:

100000 100000 A1
60813 27915 35906 35450 71839 43537 89624 45842 35899 24809 48435 2217 44437 21960 ...

output:

2069385899
2069413015
2069385899
2069385899
2069405728
2069385899
2069385899
2069418021
2069462155
2...

result:

ok 100000 tokens

Test #14:

score: 4
Accepted
time: 212ms
memory: 41412kb

input:

100000 100000 A2
87121 79038 27635 42003 15629 52946 25395 81703 22837 1509 52318 68412 51352 32652 ...

output:

-1
-1
2066343840
-1
2066254007
2066280305
2066271815
2066297969
2066244251
-1
2066244251
-1
20662442...

result:

ok 100000 tokens

Test #15:

score: 4
Accepted
time: 209ms
memory: 41352kb

input:

100000 100000 A2
26580 5717 65232 1832 81319 67060 29054 85492 3244 16560 8141 17700 61724 48692 185...

output:

2066183936
-1
2066098753
2066111054
2066159395
2066128509
2066115845
-1
2066163881
2066158056
206616...

result:

ok 100000 tokens

Test #16:

score: 4
Accepted
time: 205ms
memory: 41624kb

input:

100000 100000 A2
52889 56840 56962 8386 25109 76470 64828 21349 90186 93264 12025 83896 68639 59384 ...

output:

-1
-1
-1
2062035559
2062090967
2062035559
2062129835
-1
2062070659
2062035559
-1
-1
2062070827
20621...

result:

ok 100000 tokens

Test #17:

score: 4
Accepted
time: 276ms
memory: 41556kb

input:

100000 100000 A3
79197 7959 48691 14939 68902 85879 599 57210 77124 69963 15908 50087 75554 70077 30...

output:

2062834862
2062824918
2062818669
2062766000
2062905582
2062809539
2062766000
2062766000
2062771812
2...

result:

ok 100000 tokens

Test #18:

score: 4
Accepted
time: 185ms
memory: 19564kb

input:

100000 100000 B1
18656 34641 86288 74772 34589 99993 4258 60999 57531 85014 71735 99379 85926 86116 ...

output:

1634488457
1634488457
1634506941
1634535767
1634488457
1634488457
1634576087
1634488457
1634555630
1...

result:

ok 100000 tokens

Test #19:

score: 4
Accepted
time: 161ms
memory: 19500kb

input:

100000 100000 B1
44965 85764 78018 81326 78382 9398 40033 96859 44470 61714 75619 65571 92840 96809 ...

output:

1637107548
1637130428
1637107548
1637182618
1637107548
1637107548
1637112035
1637121799
1637107548
1...

result:

ok 100000 tokens

Test #20:

score: 4
Accepted
time: 157ms
memory: 28552kb

input:

100000 100000 C1
84428 12443 15610 41154 44069 23512 43692 645 24877 76765 31442 14858 3208 12844 54...

output:

1679007220
1679025466
1679040750
1679007220
1679150261
1679007220
1679034770
1679036976
1679007220
1...

result:

ok 100000 tokens

Test #21:

score: 4
Accepted
time: 171ms
memory: 28560kb

input:

100000 100000 C1
10732 63566 7340 47708 87862 32921 79467 36505 11815 53465 35325 81054 10123 23537 ...

output:

1680967956
1681035266
1680967956
1680967956
1681003690
1681006189
1680999057
1681048071
1681062564
1...

result:

ok 100000 tokens

Test #22:

score: 4
Accepted
time: 189ms
memory: 30200kb

input:

100000 100000 C2
37041 14685 99073 54262 31652 42331 15237 72366 98757 30164 39209 47246 17038 34230...

output:

1680377801
1680405569
1680424915
1680438043
1680408899
1680377801
1680471138
-1
1680474070
168038863...

result:

ok 100000 tokens

Test #23:

score: 4
Accepted
time: 250ms
memory: 30068kb

input:

100000 100000 C3
76504 41368 36666 14090 97342 56445 18897 76155 79164 45215 95036 96537 27410 50269...

output:

1673790266
1673780949
1673709444
1673729625
1673697220
1673728191
1673776736
1673779088
1673710935
1...

result:

ok 100000 tokens

Test #24:

score: 4
Accepted
time: 247ms
memory: 30016kb

input:

100000 100000 C3
2809 92491 28396 20644 41132 65854 54671 12012 66102 21915 98919 62729 34324 60961 ...

output:

1677406872
1677282430
1677461415
1677345064
1677344370
1677360941
1677317367
1677253195
1677364484
1...

result:

ok 100000 tokens

Test #25:

score: 4
Accepted
time: 262ms
memory: 30032kb

input:

100000 100000 C3
42271 19170 65992 80476 6818 79968 58331 15801 46509 36966 54742 12016 44697 77001 ...

output:

1681834308
1681753299
1681826393
1681763417
1681920680
1681784380
1681775694
1681823847
1681797694
1...

result:

ok 100000 tokens