求助站外题
  • 板块题目总版
  • 楼主PLDIS
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/4/14 22:11
  • 上次更新2023/10/28 03:44:19
查看原帖
求助站外题
302356
PLDIS楼主2022/4/14 22:11

RT, POJ3764 TLE

#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
#pragma GCC optimize(3)
// #define end EioorsojNfoijDewr
#define int long long
using namespace std;
int d[1000001][2], endd[1000001];
int tot = 2;
void add(int x){
        int p = x;
        vector<int> vec;
        while(p){
                vec.push_back(p % 2);
                p /= 2;
        }
        while(vec.size() <= 35){
                vec.push_back(0);
        }
        reverse(vec.begin(), vec.end());
        p = 1;
        for(int i = 0;i <= 35;i++){
        //      cout << vec[i];
                if(!d[p][vec[i]]){
                        d[p][vec[i]] = tot;
                        tot++;
                }
                p = d[p][vec[i]];
        }
        //cout << endl;
        endd[p] = 1;
}
int search(int x){
        int p = x;
        vector<int> vec;
        while(p){
                vec.push_back(p % 2);
                p /= 2;
        }
        while(vec.size() <= 35){
                vec.push_back(0);
        }
        reverse(vec.begin(), vec.end());
        p = 1;
        int ans = 0;
        for(int i = 0;i <= 35;i++){
//              cout << (vec[i] ^ 1);
                if(d[p][vec[i] ^ 1]){
        //              cout << "|";
                        ans |= (1LL << (36 - i - 1));
                        p = d[p][vec[i] ^ 1];
                }
                else{
                        p = d[p][vec[i]];
                }
        }
        //cout << endl;
        return ans;
}

// Trees.
// Do the querys

vector<pair<int, int> > gv[100001];
int xors[100001];

void add_edge(int u, int v, int w){
        gv[u].push_back(make_pair(v, w));
        gv[v].push_back(make_pair(u, w));
}
void dfs(int n, int fa){
        for(int i = 0;i < gv[n].size();i++){
                if(gv[n][i].first == fa){
                        continue;
                }
                xors[gv[n][i].first] = xors[n] ^ gv[n][i].second;
                dfs(gv[n][i].first, n);
        }
}

signed main(){
        // memset(d, 0, sizeof(d));
        int n;
        cin >> n;
        for(int i = 0;i < n - 1;i++){
                int u, v, w;
                cin >> u >> v >> w;
                add_edge(u, v, w);
        }
        dfs(0, -1);
        int maxv = 0;
        for(int i = 0;i < n;i++){
//              cout << xors[i] << " ";
                add(xors[i]);
                maxv = max(maxv, search(xors[i]));
        }
        cout << maxv << endl;
        return 0;
}
2022/4/14 22:11
加载中...