33022023-02-24 18:26:10gortomiXORfa visszatércpp17Időlimit túllépés 28/1001.588s522192 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 = sqrt(q) + 1;
    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
1Elfogadva3ms1828 KiB
2Elfogadva3ms2064 KiB
subtask211/11
3Elfogadva4ms3520 KiB
4Elfogadva4ms3404 KiB
5Elfogadva4ms4580 KiB
6Elfogadva4ms4124 KiB
7Elfogadva4ms4136 KiB
8Elfogadva4ms4872 KiB
9Elfogadva4ms4496 KiB
10Elfogadva3ms3388 KiB
11Elfogadva3ms3396 KiB
12Elfogadva3ms3652 KiB
13Elfogadva3ms3612 KiB
subtask30/13
14Elfogadva115ms18348 KiB
15Elfogadva180ms20984 KiB
16Időlimit túllépés1.577s75120 KiB
17Időlimit túllépés1.575s83000 KiB
18Időlimit túllépés1.567s76520 KiB
19Időlimit túllépés1.567s75068 KiB
20Időlimit túllépés1.569s91256 KiB
21Időlimit túllépés1.531s82256 KiB
22Elfogadva185ms21516 KiB
23Elfogadva184ms21392 KiB
subtask417/17
24Elfogadva46ms32384 KiB
25Elfogadva28ms18876 KiB
26Elfogadva71ms45416 KiB
27Elfogadva92ms58744 KiB
28Elfogadva100ms66668 KiB
29Elfogadva41ms29428 KiB
30Elfogadva50ms35196 KiB
31Elfogadva50ms35460 KiB
32Elfogadva21ms6328 KiB
33Elfogadva21ms6488 KiB
34Elfogadva21ms6336 KiB
35Elfogadva21ms6208 KiB
subtask50/59
36Futási hiba518ms522192 KiB
37Futási hiba519ms522076 KiB
38Futási hiba519ms521836 KiB
39Futási hiba603ms521812 KiB
40Futási hiba600ms521796 KiB
41Futási hiba527ms521560 KiB
42Futási hiba626ms521552 KiB
43Futási hiba560ms521556 KiB
44Futási hiba560ms521536 KiB
45Időlimit túllépés1.58s130600 KiB
46Időlimit túllépés1.572s213328 KiB
47Időlimit túllépés1.562s204348 KiB
48Időlimit túllépés1.588s214372 KiB
49Időlimit túllépés1.575s212620 KiB