This commit is contained in:
Zengtudor 2025-08-22 20:50:15 +08:00
parent 776290a513
commit 8d2960a1ae
3 changed files with 99 additions and 63 deletions

View File

@ -6,7 +6,7 @@ add_compile_options(-fsanitize=address,pointer-compare,pointer-subtract,undefine
add_link_options(-fsanitize=address,pointer-compare,pointer-subtract,undefined -fno-omit-frame-pointer)
include_directories(${CMAKE_CURRENT_LIST_DIR}/include)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD 26)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

96
src/8/22/P4551.cpp Normal file
View File

@ -0,0 +1,96 @@
#include <algorithm>
#include <iostream>
#include <vector>
void fast_io() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
}
const int MAXN = 100005;
const int BITS = 31;
std::vector<std::pair<int, int>> adj[MAXN];
int dist[MAXN];
namespace Trie {
int trie[MAXN * BITS][2];
int nodec;
void init() {
trie[0][0] = trie[0][1] = 0;
nodec = 1;
}
void insert(int val) {
int curnode = 0;
for (int i = BITS - 1; i >= 0; --i) {
int bit = (val >> i) & 1;
if (!trie[curnode][bit]) {
trie[nodec][0] = trie[nodec][1] = 0;
trie[curnode][bit] = nodec++;
}
curnode = trie[curnode][bit];
}
}
int query_max_xor(int val) {
int curnode = 0;
int maxorval = 0;
for (int i = BITS - 1; i >= 0; --i) {
int bit = (val >> i) & 1;
if (trie[curnode][!bit]) {
maxorval |= (1 << i);
curnode = trie[curnode][!bit];
} else {
curnode = trie[curnode][bit];
}
}
return maxorval;
}
}
void dfs(int u, int p, int curxorsum) {
dist[u] = curxorsum;
for (auto &edge : adj[u]) {
int v = edge.first;
int weight = edge.second;
if (v == p) {
continue;
}
dfs(v, u, curxorsum ^ weight);
}
}
int main() {
fast_io();
int n;
std::cin >> n;
for (int i = 0; i < n - 1; ++i) {
int u, v, w;
std::cin >> u >> v >> w;
adj[u].push_back({v, w});
adj[v].push_back({u, w});
}
dfs(1, 0, 0);
Trie::init();
for (int i = 1; i <= n; ++i) {
Trie::insert(dist[i]);
}
int max_ans = 0;
for (int i = 1; i <= n; ++i) {
max_ans = std::max(max_ans, Trie::query_max_xor(dist[i]));
}
std::cout << max_ans << '\n';
return 0;
}

View File

@ -1,64 +1,4 @@
#include <list>
class MyLinkedList {
public:
std::list<int> l;
MyLinkedList() {
}
int get(int index) {
if(index>=l.size()){
return -1;
}
auto p = l.begin();
while(index--){
p++;
}
return *p;
}
void addAtHead(int val) {
l.push_front(val);
}
void addAtTail(int val) {
l.push_back(val);
}
void addAtIndex(int index, int val) {
if(index==l.size()){
l.push_back(val);
return;
}
if(index>l.size())return;
auto p = l.begin();
while(index--){
++p;
}
l.insert(p,val);
}
void deleteAtIndex(int index) {
if(0<=index && index<l.size()){
auto p = l.begin();
while(index--){
++p;
}
l.erase(p);
}
}
};
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList* obj = new MyLinkedList();
* int param_1 = obj->get(index);
* obj->addAtHead(val);
* obj->addAtTail(val);
* obj->addAtIndex(index,val);
* obj->deleteAtIndex(index);
*/
int main(){
int main(){
}
}