답안 #637945

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
637945 2022-09-03T16:39:32 Z Iwanttobreakfree Klasika (COCI20_klasika) C++17
33 / 110
824 ms 84588 KB
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int best=0;
vector<map<int,int>> trie(1);
void add(int u,int x){
    for(int i=30;i>=0;i--){
        if(trie[u].find(x&(1<<i))==trie[u].end()){
                map<int,int> mp;
                trie[u][x&(1<<i)]=trie.size();
                trie.push_back(mp);
        }
        u=trie[u][x&(1<<i)];
    }
}
int maxi(int u,int x){
    int ans=0;
    for(int i=30;i>=0;i--){
        int to=(x&(1<<i))^(1<<i);
        //cout<<to<<' ';
        if(trie[u].find(to)!=trie[u].end()){
            ans+=to;
            u=trie[u][to];
        }else u=trie[u][to^(1<<i)];
        //cout<<u<<' '<<i<<' '<<to<<'\n';
    }
    return ans;
}
int bin_jump_dist(int a,int dif,vector<vector<int>>& par,vector<vector<int>>& dist){
    int ans=0;
    for(int i=17;i>=0;i--){
        if(dif&(1<<i)){
            ans^=dist[a][i];
            a=par[a][i];
        }
    }
    return ans;
}
int bin_jump_node(int a,int dif,vector<vector<int>>& par,vector<vector<int>>& dist){
    int ans=0;
    for(int i=17;i>=0;i--){
        if(dif&(1<<i)){
            ans^=dist[a][i];
            a=par[a][i];
        }
    }
    return a;
}
int LCA(int x,int y,vector<vector<int>>& par,vector<vector<int>>& dist,vector<int>& depth){
    if(depth[x]>depth[y])swap(x,y);
    int ans=bin_jump_dist(y,depth[y]-depth[x],par,dist);
    y=bin_jump_node(y,depth[y]-depth[x],par,dist);
    //cout<<ans<<'\n';
    if(x==y)return ans;
    for(int i=17;i>=0;i--){
        if(par[x][i]!=par[y][i]){
            ans^=dist[x][i];
            ans^=dist[y][i];
            x=par[x][i];
            y=par[y][i];
        }
    }
    return ans^dist[x][0]^dist[y][0];
}
void dfs(int a,vector<vector<pair<int,int>>>& g,int cnt,int sol){
    best=max(best,cnt^sol);
    for(auto x:g[a]){
        dfs(x.first,g,cnt^x.second,sol);
    }
}
int main(){
    int q,x,y,sz=1;
    string s;
    vector<vector<int>> par(1,vector<int>(18));
    vector<vector<int>> w(1,vector<int>(18));
    vector<int> depth(1),root1(1);
    for(int i=0;i<18;i++)par[0][i]=0;
    vector<vector<pair<int,int>>> g(3000,vector<pair<int,int>>());
    add(0,0);
    cin>>q;
    for(int qu=0;qu<q;qu++){
        cin>>s>>x>>y;
        if(s=="Add"){
            x--;
            if(q<2001)g[x].push_back({par.size(),y});
            depth.push_back(depth[x]+1);
            root1.push_back(y^root1[x]);
            add(0,root1.back());
            vector<int> parx(18),wx(18);
            wx[0]=y;
            parx[0]=x;
            for(int i=1;i<18;i++){
                parx[i]=par[parx[i-1]][i-1];
                wx[i]=w[parx[i-1]][i-1]^wx[i-1];
                //cout<<wx[i]<<' ';
            }
            //cout<<wx[0]<<'\n';
            par.push_back(parx);
            w.push_back(wx);
        }
        else{
            x--;y--;
            int sol=LCA(x,y,par,w,depth);
            best=sol;
            //cout<<sol<<'\n';
            if(q>2000)best=maxi(0,best);
            else dfs(y,g,0,sol);
            cout<<best<<'\n';
            //cout<<trie.size()<<'\n';
        }
    }
}

Compilation message

klasika.cpp: In function 'int main()':
klasika.cpp:73:15: warning: unused variable 'sz' [-Wunused-variable]
   73 |     int q,x,y,sz=1;
      |               ^~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 468 KB Output is correct
2 Correct 1 ms 468 KB Output is correct
3 Correct 1 ms 724 KB Output is correct
4 Correct 1 ms 724 KB Output is correct
5 Correct 1 ms 468 KB Output is correct
6 Correct 1 ms 468 KB Output is correct
7 Correct 1 ms 724 KB Output is correct
8 Correct 1 ms 724 KB Output is correct
9 Correct 1 ms 468 KB Output is correct
10 Correct 1 ms 596 KB Output is correct
11 Correct 1 ms 724 KB Output is correct
12 Correct 1 ms 724 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 468 KB Output is correct
2 Correct 1 ms 468 KB Output is correct
3 Correct 1 ms 724 KB Output is correct
4 Correct 1 ms 724 KB Output is correct
5 Correct 1 ms 468 KB Output is correct
6 Correct 1 ms 468 KB Output is correct
7 Correct 1 ms 724 KB Output is correct
8 Correct 1 ms 724 KB Output is correct
9 Correct 1 ms 468 KB Output is correct
10 Correct 1 ms 596 KB Output is correct
11 Correct 1 ms 724 KB Output is correct
12 Correct 1 ms 724 KB Output is correct
13 Correct 7 ms 1552 KB Output is correct
14 Correct 9 ms 2852 KB Output is correct
15 Correct 9 ms 3080 KB Output is correct
16 Correct 11 ms 5488 KB Output is correct
17 Correct 5 ms 1552 KB Output is correct
18 Correct 6 ms 2828 KB Output is correct
19 Correct 7 ms 3080 KB Output is correct
20 Correct 8 ms 3720 KB Output is correct
21 Correct 6 ms 1552 KB Output is correct
22 Correct 6 ms 2828 KB Output is correct
23 Correct 7 ms 3080 KB Output is correct
24 Correct 8 ms 3720 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 824 ms 84588 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 468 KB Output is correct
2 Correct 1 ms 468 KB Output is correct
3 Correct 1 ms 724 KB Output is correct
4 Correct 1 ms 724 KB Output is correct
5 Correct 1 ms 468 KB Output is correct
6 Correct 1 ms 468 KB Output is correct
7 Correct 1 ms 724 KB Output is correct
8 Correct 1 ms 724 KB Output is correct
9 Correct 1 ms 468 KB Output is correct
10 Correct 1 ms 596 KB Output is correct
11 Correct 1 ms 724 KB Output is correct
12 Correct 1 ms 724 KB Output is correct
13 Correct 7 ms 1552 KB Output is correct
14 Correct 9 ms 2852 KB Output is correct
15 Correct 9 ms 3080 KB Output is correct
16 Correct 11 ms 5488 KB Output is correct
17 Correct 5 ms 1552 KB Output is correct
18 Correct 6 ms 2828 KB Output is correct
19 Correct 7 ms 3080 KB Output is correct
20 Correct 8 ms 3720 KB Output is correct
21 Correct 6 ms 1552 KB Output is correct
22 Correct 6 ms 2828 KB Output is correct
23 Correct 7 ms 3080 KB Output is correct
24 Correct 8 ms 3720 KB Output is correct
25 Incorrect 824 ms 84588 KB Output isn't correct
26 Halted 0 ms 0 KB -