3308 2023. 02. 24 20:32:05 gortomi XORfa visszatér cpp17 Időlimit túllépés 28/100 1.598s 522304 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 Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 1708 KiB
2 Elfogadva 3ms 2016 KiB
subtask2 11/11
3 Elfogadva 4ms 2392 KiB
4 Elfogadva 3ms 2640 KiB
5 Elfogadva 4ms 3048 KiB
6 Elfogadva 4ms 3212 KiB
7 Elfogadva 4ms 3160 KiB
8 Elfogadva 4ms 3264 KiB
9 Elfogadva 4ms 3420 KiB
10 Elfogadva 4ms 3408 KiB
11 Elfogadva 4ms 3432 KiB
12 Elfogadva 4ms 3520 KiB
13 Elfogadva 4ms 3732 KiB
subtask3 0/13
14 Elfogadva 79ms 17360 KiB
15 Elfogadva 115ms 18772 KiB
16 Időlimit túllépés 1.567s 67184 KiB
17 Időlimit túllépés 1.554s 77976 KiB
18 Időlimit túllépés 1.58s 91800 KiB
19 Időlimit túllépés 1.58s 91520 KiB
20 Időlimit túllépés 1.587s 75076 KiB
21 Időlimit túllépés 1.55s 78408 KiB
22 Elfogadva 119ms 19264 KiB
23 Elfogadva 123ms 19276 KiB
subtask4 17/17
24 Elfogadva 79ms 11192 KiB
25 Elfogadva 45ms 9004 KiB
26 Elfogadva 118ms 13728 KiB
27 Elfogadva 156ms 15712 KiB
28 Elfogadva 185ms 17164 KiB
29 Elfogadva 71ms 10840 KiB
30 Elfogadva 86ms 11804 KiB
31 Elfogadva 90ms 11680 KiB
32 Elfogadva 67ms 7336 KiB
33 Elfogadva 67ms 7492 KiB
34 Elfogadva 65ms 7500 KiB
35 Elfogadva 67ms 7392 KiB
subtask5 0/59
36 Futási hiba 529ms 522304 KiB
37 Futási hiba 529ms 522272 KiB
38 Futási hiba 523ms 522168 KiB
39 Futási hiba 616ms 522164 KiB
40 Futási hiba 514ms 522144 KiB
41 Futási hiba 527ms 522012 KiB
42 Futási hiba 529ms 521996 KiB
43 Futási hiba 532ms 522000 KiB
44 Futási hiba 632ms 521980 KiB
45 Időlimit túllépés 1.582s 119844 KiB
46 Időlimit túllépés 1.598s 194536 KiB
47 Időlimit túllépés 1.577s 203612 KiB
48 Időlimit túllépés 1.598s 202712 KiB
49 Időlimit túllépés 1.58s 186036 KiB