33172023-02-25 09:20:29gortomiXORfa visszatércpp17Időlimit túllépés 28/1001.585s522040 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(m + 1, r);
        }
    }
    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 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ÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1840 KiB
2Elfogadva3ms2044 KiB
subtask211/11
3Elfogadva4ms2668 KiB
4Elfogadva3ms2732 KiB
5Elfogadva4ms3152 KiB
6Elfogadva4ms3184 KiB
7Elfogadva4ms3404 KiB
8Elfogadva4ms3404 KiB
9Elfogadva4ms3504 KiB
10Elfogadva4ms3472 KiB
11Elfogadva4ms3420 KiB
12Elfogadva4ms3544 KiB
13Elfogadva4ms3588 KiB
subtask30/13
14Elfogadva79ms17244 KiB
15Elfogadva115ms18548 KiB
16Időlimit túllépés1.585s67196 KiB
17Időlimit túllépés1.572s78096 KiB
18Időlimit túllépés1.585s91992 KiB
19Időlimit túllépés1.572s95392 KiB
20Időlimit túllépés1.572s74896 KiB
21Időlimit túllépés1.572s78536 KiB
22Elfogadva119ms19636 KiB
23Elfogadva115ms19608 KiB
subtask417/17
24Elfogadva78ms11308 KiB
25Elfogadva45ms9032 KiB
26Elfogadva115ms13832 KiB
27Elfogadva155ms16016 KiB
28Elfogadva186ms17512 KiB
29Elfogadva70ms11232 KiB
30Elfogadva87ms12256 KiB
31Elfogadva90ms12184 KiB
32Elfogadva67ms7820 KiB
33Elfogadva67ms7748 KiB
34Elfogadva67ms7840 KiB
35Elfogadva67ms7988 KiB
subtask50/59
36Futási hiba523ms522040 KiB
37Futási hiba523ms522012 KiB
38Futási hiba518ms521992 KiB
39Futási hiba510ms521760 KiB
40Futási hiba512ms521736 KiB
41Futási hiba524ms521736 KiB
42Futási hiba537ms521724 KiB
43Futási hiba544ms521728 KiB
44Futási hiba541ms521724 KiB
45Időlimit túllépés1.56s119172 KiB
46Időlimit túllépés1.582s188240 KiB
47Időlimit túllépés1.559s198100 KiB
48Időlimit túllépés1.572s196044 KiB
49Időlimit túllépés1.58s187320 KiB