UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#214629#2376. 树与异或N1002820ms87028kbC++112.2kb2024-11-20 21:02:092024-11-20 23:07:29

answer

//
//  na 2376.cpp
//  Competitive Programming
//
//  Created by m2 on 2024/11/20.
//

#include <stdio.h>
#include <iostream>
using namespace std;
typedef long long int ll;
const int maxn = 1e6 + 5, mod = 1e9 + 7;
int n, q, v[maxn], v1[maxn], v2[maxn], p[maxn], ans;
inline int mult(int a, int b){
    return ll(a) * b % mod;
}
inline void add(int &a, int b){
    if((a += b) >= mod)
        a -= mod;
}
inline void qread(int &var){
    var = 0;
    char reg = getchar();
    while(reg - 48 > 9u)
        reg = getchar();
    do{
        var = (var << 1) + (var << 3) + (reg ^ 48);
        reg = getchar();
    }while(reg - 48 < 10u);
}
struct Edge{
    int val;
    Edge* nxt;
    Edge(int val, Edge* nxt): val(val), nxt(nxt) {}
};
Edge *head[maxn];
inline void edge(int st, int en){
    if(head[st])
        head[st] = new Edge(en, head[st]);
    else
        head[st] = new Edge(en, nullptr);
}
void dfs(int idx, int from){
    p[idx] = from;
    for(Edge *e = head[idx]; e; e = e->nxt)
        if(e->val != from)
            dfs(e->val, idx);
}
inline void add(int idx){
    if(p[idx]){
        v1[p[idx]] ^= v[idx];
        if(p[p[idx]])
            v2[p[p[idx]]] ^= v[idx];
    }
}
inline int query(int idx){
    int res = v2[idx] ^ v1[idx] ^ v[idx];
    if(p[idx]){
        res ^= v1[p[idx]] ^ v[idx] ^ v[p[idx]];
        if(p[p[idx]])
            res ^= v[p[p[idx]]];
    }
    return res;
}
//#define READFILE
int main(){
    cin.tie(0)->sync_with_stdio(false);
#if defined(READFILE) && defined(MAC_OS_VERSION_11_0)
    freopen("/Users/m2/Downloads/ex_xor2.in", "r", stdin);
#endif
    qread(n); qread(q);
    for(int i = 1; i <= n; ++i)
        qread(v[i]);
    for(int u, v, i = 1; i < n; ++i){
        qread(u); qread(v);
        edge(u, v);
        edge(v, u);
    }
    dfs(1, 0);
    for(int i = 1; i <= n; ++i)
        add(i);
    for(int x, rv, rans, i = 1; i <= q; ++i){
        qread(x); qread(rv);
        add(x);
        v[x] = rv;
        add(x);
        rans = query(x);
//        cerr << "rans = " << rans << endl;
        add(ans, mult(mult(i, i), rans % mod));
    }
    cout << ans << endl;
    return 0;
}

详细

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

Test #1:

score: 10
Accepted
time: 0ms
memory: 1340kb

input:

1000 994
780089107 4670366 871010085 73730768 526852049 572589363 885190993 1049357301 450850404 460...

output:

503748432

result:

ok 1 number(s): "503748432"

Test #2:

score: 10
Accepted
time: 0ms
memory: 1340kb

input:

1000 999
26885995 181771373 378079250 245122183 660787775 479226046 575400611 257120086 214404794 48...

output:

301019013

result:

ok 1 number(s): "301019013"

Test #3:

score: 10
Accepted
time: 0ms
memory: 1340kb

input:

1000 994
978408146 31636243 945016735 512129400 92881624 689719983 649699545 964802847 100094796 941...

output:

250985726

result:

ok 1 number(s): "250985726"

Test #4:

score: 10
Accepted
time: 42ms
memory: 9832kb

input:

100000 99994
194640838 777315353 114710204 754050649 372592717 210279787 542056883 638262010 7998293...

output:

897014293

result:

ok 1 number(s): "897014293"

Test #5:

score: 10
Accepted
time: 39ms
memory: 9820kb

input:

100000 100000
458877901 215980825 777376132 863774865 34430451 828397116 94813690 931300514 10548367...

output:

351450518

result:

ok 1 number(s): "351450518"

Test #6:

score: 10
Accepted
time: 47ms
memory: 9832kb

input:

100000 99991
56406146 757409402 876799234 573444553 883023109 326033134 328116703 623771278 41269529...

output:

440189625

result:

ok 1 number(s): "440189625"

Test #7:

score: 10
Accepted
time: 679ms
memory: 87028kb

input:

1000000 999998
814298729 663807029 628693441 45635199 148428014 913833778 1034283337 600802841 58045...

output:

447637970

result:

ok 1 number(s): "447637970"

Test #8:

score: 10
Accepted
time: 673ms
memory: 87016kb

input:

1000000 999993
112899321 425466951 471078924 857561298 449437156 710041336 1033281580 23390934 44420...

output:

449713864

result:

ok 1 number(s): "449713864"

Test #9:

score: 10
Accepted
time: 673ms
memory: 87012kb

input:

1000000 1000000
273043260 1042513348 30746190 864557483 187812119 562837674 263192174 364182254 3537...

output:

922464355

result:

ok 1 number(s): "922464355"

Test #10:

score: 10
Accepted
time: 667ms
memory: 87016kb

input:

1000000 999995
83067658 1064735371 623243759 757522311 539363923 924297206 75317137 543750195 822898...

output:

318242296

result:

ok 1 number(s): "318242296"

Extra Test:

score: 0
Extra Test Passed