3322 2023. 02. 25 14:33:01 gortomi XORfa visszatér cpp17 Időlimit túllépés 28/100 1.613s 521828 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
vector<vector<pair<int, int> > > g;
vector<int> v;
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);
        }
    }
};
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n, q;
    cin >> n >> q;
    g.resize(n + 1);
    v.resize(n + 1);
    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});
    node root = node();
    vector<node> trie(b, root);
    vector<int> maxi(b);
    vector<vector<int> > ins(q);
    for(auto x : add)
    {
        int l = x.first, r = x.second;
        int val = no[l];
        while(l % b != 0 && l <= r)
        {
            ins[l].push_back(val);
            l++;
        }
        while(l + b - 1 <= r)
        {
            trie[l / b].upd(v[val], 29, 1);
            maxi[l / b] = max(maxi[l / b], trie[l / b].get(v[val], 29));
            l += b;
        }
        while(l <= r)
        {
            ins[l].push_back(val);
            l++;
        }
    }
    for(int i = 0; i < q; i++)
    {
        int actb = i / b;
        int ans = maxi[actb];
        for(auto x : ins[i])
        {
            trie[actb].upd(v[x], 29, 1);
            ans = max(ans, trie[actb].get(v[x], 29));
        }
        cout << ans << "\n";
        for(auto x : ins[i]) trie[actb].upd(v[x], 29, -1);
    }
    return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 1836 KiB
2 Elfogadva 3ms 2060 KiB
subtask2 11/11
3 Elfogadva 4ms 2528 KiB
4 Elfogadva 3ms 2580 KiB
5 Elfogadva 4ms 2752 KiB
6 Elfogadva 4ms 2860 KiB
7 Elfogadva 4ms 3072 KiB
8 Elfogadva 4ms 3408 KiB
9 Elfogadva 4ms 3336 KiB
10 Elfogadva 4ms 3516 KiB
11 Elfogadva 4ms 3604 KiB
12 Elfogadva 4ms 3648 KiB
13 Elfogadva 4ms 3592 KiB
subtask3 0/13
14 Elfogadva 86ms 20708 KiB
15 Elfogadva 123ms 23460 KiB
16 Időlimit túllépés 1.567s 124772 KiB
17 Időlimit túllépés 1.557s 146548 KiB
18 Időlimit túllépés 1.572s 137720 KiB
19 Időlimit túllépés 1.582s 167104 KiB
20 Időlimit túllépés 1.552s 140116 KiB
21 Időlimit túllépés 1.595s 146492 KiB
22 Elfogadva 133ms 24168 KiB
23 Elfogadva 123ms 24268 KiB
subtask4 17/17
24 Elfogadva 75ms 10496 KiB
25 Elfogadva 41ms 8548 KiB
26 Elfogadva 112ms 13392 KiB
27 Elfogadva 144ms 15148 KiB
28 Elfogadva 174ms 16468 KiB
29 Elfogadva 64ms 10808 KiB
30 Elfogadva 85ms 11540 KiB
31 Elfogadva 87ms 11768 KiB
32 Elfogadva 68ms 10652 KiB
33 Elfogadva 68ms 10668 KiB
34 Elfogadva 68ms 10764 KiB
35 Elfogadva 68ms 10768 KiB
subtask5 0/59
36 Futási hiba 754ms 521828 KiB
37 Futási hiba 630ms 521820 KiB
38 Futási hiba 652ms 521800 KiB
39 Futási hiba 638ms 521776 KiB
40 Futási hiba 732ms 521768 KiB
41 Futási hiba 651ms 521676 KiB
42 Futási hiba 633ms 521660 KiB
43 Futási hiba 615ms 521660 KiB
44 Futási hiba 615ms 521644 KiB
45 Időlimit túllépés 1.564s 109492 KiB
46 Időlimit túllépés 1.582s 237536 KiB
47 Időlimit túllépés 1.57s 238116 KiB
48 Időlimit túllépés 1.613s 254384 KiB
49 Időlimit túllépés 1.578s 241176 KiB