3537 2023. 02. 28 19:51:41 gortomi XORfa visszatér cpp17 Elfogadva 100/100 698ms 119336 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
vector<vector<pair<int, int> > > g;
vector<int> v, ans;
vector<vector<int> > t;

void dfs(int n, int p)
{
    for(auto x : g[n])
    {
        int y = x.first, z = x.second;
        if(y != p)
        {
            v[y] = v[n] ^ z;
            dfs(y, n);
        }
    }
}
struct node
{
    int w;
    node *lc, *rc;
    node()
    {
        w = 0;
        lc = nullptr;
        rc = nullptr;
    }
    void extend()
    {
        if(lc == nullptr)
        {
            lc = new node();
            rc = new node();
        }
    }
    void upd(int k, int ind, int del)
    {
        w += del;
        if(ind == -1) return;
        extend();
        if((k >> ind) & 1) rc -> upd(k, ind - 1, del);
        else lc -> upd(k, ind - 1, del);
    }
    int get(int k, int ind)
    {
        if(ind == -1) return 0;
        extend();
        if((k >> ind) & 1)
        {
            if(lc -> w > 0) return lc -> get(k, ind - 1) + (1 << ind);
            else return rc -> get(k, ind - 1);
        }
        else
        {
            if(rc -> w > 0) return rc -> get(k, ind - 1) + (1 << ind);
            else return lc -> get(k, ind - 1);
        }
    }
};
node root = node();
int maxi = 0;
void update(int no, int l, int r, int tl, int tr, int val)
{
    if(tl > tr) return;
    if(l == tl && r == tr)
    {
        t[no].push_back(val);
        return;
    }
    int m = (l + r) / 2;
    update(no * 2, l, m, tl, min(tr, m), val);
    update(no * 2 + 1, m + 1, r, max(tl, m + 1), tr, val);
}
void get(int no, int l, int r)
{
    int k = maxi;
    for(auto x : t[no])
    {
        root.upd(x, 29, 1);
        maxi = max(maxi, root.get(x, 29));
    }
    if(l == r) ans[l] = maxi;
    else
    {
        int m = (l + r) / 2;
        get(no * 2, l, m);
        get(no * 2 + 1, m + 1, r);
    }
    for(auto x : t[no])
    {
        root.upd(x, 29, -1);
    }
    maxi = k;
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n, q;
    cin >> n >> q;
    g.resize(n + 1);
    v.resize(n + 1);
    ans.resize(q);
    t.resize(4 * q);
    for(int i = 0; i < n - 1; i++)
    {
        int x, y, w;
        cin >> x >> y >> w;
        g[x].push_back({y, w});
        g[y].push_back({x, w});
    }
    dfs(1, 0);
    const int b = 300;
    vector<int> no(q);
    vector<int> act(n + 1, -1);
    vector<pair<int, int> > add;
    for(int i = 0; i < q; i++)
    {
        cin >> no[i];
        if(act[no[i]] == -1)
        {
            act[no[i]] = i;
        }
        else
        {
            add.push_back({act[no[i]], i - 1});
            act[no[i]] = -1;
        }
    }
    for(int i = 1; i <= n; i++) if(act[i] != -1) add.push_back({act[i], q - 1});
    for(auto x : add)
    {
        update(1, 0, q - 1, x.first, x.second, v[no[x.first]]);
    }
    get(1, 0, q - 1);
    for(auto x : ans) cout << x << "\n";
    return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 1828 KiB
2 Elfogadva 3ms 2060 KiB
subtask2 11/11
3 Elfogadva 3ms 2520 KiB
4 Elfogadva 3ms 2748 KiB
5 Elfogadva 3ms 3036 KiB
6 Elfogadva 3ms 3184 KiB
7 Elfogadva 3ms 3404 KiB
8 Elfogadva 3ms 3572 KiB
9 Elfogadva 3ms 3640 KiB
10 Elfogadva 3ms 3420 KiB
11 Elfogadva 3ms 3744 KiB
12 Elfogadva 3ms 3892 KiB
13 Elfogadva 3ms 3844 KiB
subtask3 13/13
14 Elfogadva 74ms 27564 KiB
15 Elfogadva 79ms 28292 KiB
16 Elfogadva 178ms 33984 KiB
17 Elfogadva 197ms 35928 KiB
18 Elfogadva 207ms 35964 KiB
19 Elfogadva 215ms 35568 KiB
20 Elfogadva 192ms 35432 KiB
21 Elfogadva 201ms 36136 KiB
22 Elfogadva 83ms 28656 KiB
23 Elfogadva 82ms 28572 KiB
subtask4 17/17
24 Elfogadva 7ms 6608 KiB
25 Elfogadva 6ms 6520 KiB
26 Elfogadva 8ms 6952 KiB
27 Elfogadva 8ms 7280 KiB
28 Elfogadva 8ms 7492 KiB
29 Elfogadva 7ms 6608 KiB
30 Elfogadva 7ms 6632 KiB
31 Elfogadva 8ms 6628 KiB
32 Elfogadva 4ms 5100 KiB
33 Elfogadva 4ms 5096 KiB
34 Elfogadva 4ms 5096 KiB
35 Elfogadva 4ms 5160 KiB
subtask5 59/59
36 Elfogadva 495ms 90752 KiB
37 Elfogadva 384ms 80836 KiB
38 Elfogadva 598ms 102432 KiB
39 Elfogadva 698ms 113468 KiB
40 Elfogadva 630ms 119336 KiB
41 Elfogadva 481ms 90120 KiB
42 Elfogadva 519ms 90652 KiB
43 Elfogadva 453ms 90580 KiB
44 Elfogadva 435ms 90072 KiB
45 Elfogadva 206ms 70224 KiB
46 Elfogadva 231ms 36864 KiB
47 Elfogadva 212ms 36876 KiB
48 Elfogadva 218ms 36880 KiB
49 Elfogadva 216ms 36860 KiB