33082023-02-24 20:32:05gortomiXORfa visszatércpp17Időlimit túllépés 28/1001.598s522304 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 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
1Elfogadva3ms1708 KiB
2Elfogadva3ms2016 KiB
subtask211/11
3Elfogadva4ms2392 KiB
4Elfogadva3ms2640 KiB
5Elfogadva4ms3048 KiB
6Elfogadva4ms3212 KiB
7Elfogadva4ms3160 KiB
8Elfogadva4ms3264 KiB
9Elfogadva4ms3420 KiB
10Elfogadva4ms3408 KiB
11Elfogadva4ms3432 KiB
12Elfogadva4ms3520 KiB
13Elfogadva4ms3732 KiB
subtask30/13
14Elfogadva79ms17360 KiB
15Elfogadva115ms18772 KiB
16Időlimit túllépés1.567s67184 KiB
17Időlimit túllépés1.554s77976 KiB
18Időlimit túllépés1.58s91800 KiB
19Időlimit túllépés1.58s91520 KiB
20Időlimit túllépés1.587s75076 KiB
21Időlimit túllépés1.55s78408 KiB
22Elfogadva119ms19264 KiB
23Elfogadva123ms19276 KiB
subtask417/17
24Elfogadva79ms11192 KiB
25Elfogadva45ms9004 KiB
26Elfogadva118ms13728 KiB
27Elfogadva156ms15712 KiB
28Elfogadva185ms17164 KiB
29Elfogadva71ms10840 KiB
30Elfogadva86ms11804 KiB
31Elfogadva90ms11680 KiB
32Elfogadva67ms7336 KiB
33Elfogadva67ms7492 KiB
34Elfogadva65ms7500 KiB
35Elfogadva67ms7392 KiB
subtask50/59
36Futási hiba529ms522304 KiB
37Futási hiba529ms522272 KiB
38Futási hiba523ms522168 KiB
39Futási hiba616ms522164 KiB
40Futási hiba514ms522144 KiB
41Futási hiba527ms522012 KiB
42Futási hiba529ms521996 KiB
43Futási hiba532ms522000 KiB
44Futási hiba632ms521980 KiB
45Időlimit túllépés1.582s119844 KiB
46Időlimit túllépés1.598s194536 KiB
47Időlimit túllépés1.577s203612 KiB
48Időlimit túllépés1.598s202712 KiB
49Időlimit túllépés1.58s186036 KiB