33072023-02-24 19:53:45gortomiXORfa visszatércpp17Időlimit túllépés 28/1001.588s522252 KiB
#include <bits/stdc++.h>
using namespace std;
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 l, r, w, m;
    node *lc, *rc;
    node(int il, int ir)
    {
        l = il;
        r = ir;
        m = (l + r) / 2;
        w = 0;
        lc = nullptr;
        rc = nullptr;
    }
    void extend()
    {
        if(lc == nullptr)
        {
            lc = new node(l, m);
            rc = new node(r, m);
        }
    }
    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);
        }
    }
};
int 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 neu = node(0, 0);
    vector<node> trie(b, neu);
    vector<int> maxi(b);
    vector<vector<int> > ins(q);
    for(int i = 0; i < b; i++) trie[i] = node(0, (1 << 30) - 1);
    for(auto x : add)
    {
        int val = no[x.first];
        int sb = x.first / b  + 1, eb = x.second / b - 1;
        for(int i = sb; i <= eb; i++)
        {
            trie[i].upd(v[val], 29, 1);
            maxi[i] = max(maxi[i], trie[i].get(v[val], 29));
        }
        for(int i = x.first; i <= min(sb * b - 1, x.second); i++) ins[i].push_back(val);
        for(int i = max(eb * b + 1, x.first); i <= x.second; i++) ins[i].push_back(val);
    }
    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ÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1836 KiB
2Elfogadva3ms2048 KiB
subtask211/11
3Elfogadva4ms2432 KiB
4Elfogadva4ms2400 KiB
5Elfogadva6ms2640 KiB
6Elfogadva4ms2800 KiB
7Elfogadva4ms2968 KiB
8Elfogadva6ms3224 KiB
9Elfogadva4ms3396 KiB
10Elfogadva6ms3476 KiB
11Elfogadva4ms3684 KiB
12Elfogadva4ms3820 KiB
13Elfogadva4ms3804 KiB
subtask30/13
14Elfogadva112ms18344 KiB
15Elfogadva177ms20944 KiB
16Időlimit túllépés1.567s117756 KiB
17Időlimit túllépés1.583s134968 KiB
18Időlimit túllépés1.557s117988 KiB
19Időlimit túllépés1.57s152780 KiB
20Időlimit túllépés1.57s129300 KiB
21Időlimit túllépés1.588s134388 KiB
22Elfogadva182ms21536 KiB
23Elfogadva184ms21548 KiB
subtask417/17
24Elfogadva158ms12096 KiB
25Elfogadva78ms9532 KiB
26Elfogadva254ms15372 KiB
27Elfogadva347ms17708 KiB
28Elfogadva412ms19428 KiB
29Elfogadva141ms11740 KiB
30Elfogadva179ms13192 KiB
31Elfogadva180ms13100 KiB
32Elfogadva130ms10320 KiB
33Elfogadva131ms10288 KiB
34Elfogadva131ms10232 KiB
35Elfogadva129ms10240 KiB
subtask50/59
36Futási hiba532ms522252 KiB
37Futási hiba527ms522224 KiB
38Futási hiba526ms522200 KiB
39Futási hiba617ms521972 KiB
40Futási hiba521ms521968 KiB
41Futási hiba529ms521952 KiB
42Futási hiba532ms521724 KiB
43Futási hiba532ms521724 KiB
44Futási hiba643ms521708 KiB
45Időlimit túllépés1.565s110584 KiB
46Időlimit túllépés1.588s226216 KiB
47Időlimit túllépés1.564s228464 KiB
48Időlimit túllépés1.559s226100 KiB
49Időlimit túllépés1.58s232292 KiB