283 2021. 06. 22 15:43:57 mraron Multiplikátoros telebabrátor cpp14 Elfogadva 100/100 483ms 278768 KiB
#include<bits/stdc++.h>
using namespace std;

const int SIGMA=2;
const int MAXN=30*100100;

struct trie {
	int id=1;
	
	int tree[MAXN][SIGMA];
	int sz[MAXN];
	trie() {
		clear();
	}
	
	void clear() {
		id=1;
		memset(tree,0,sizeof tree);
		memset(sz,0,sizeof sz);
	}
	
	int size() {
		return id;
	}
	
	#define HASH(x) ((x)-'a')
	
	void insert(string& t) {
		int akt=1;
		for(auto i:t) {
			if(tree[akt][HASH(i)]==0) {
				tree[akt][HASH(i)]=++id;
			}
			
			sz[akt]++;
			akt=tree[akt][HASH(i)];
		}
		
		sz[akt]++;
	}
	
	bool query(string &t) {
		int akt=1;
		for(auto i:t) {
			if(sz[tree[akt][HASH(i)]]==0) return false;
			akt=tree[akt][HASH(i)];
		}
		
		return sz[akt]>0;
	}
	
	void remove(string& t) {
		int akt=1;
		for(auto i:t) {
			if(sz[tree[akt][HASH(i)]]==0) {
				return ; //nincs benne
			}
			
			sz[akt]--;
			akt=tree[akt][HASH(i)];
		}
		
		sz[akt]--;
	}
	
	#define BITS 30
	void insert_bits(int x) {
		int akt=1;
		for(int i=BITS;i>=0;i--) {
			int bit=(x&(1<<i))!=0;
			if(tree[akt][bit]==0) {
				tree[akt][bit]=++id;
			}
			sz[akt]++;
			akt=tree[akt][bit];
		}		
		sz[akt]++;
	}
	
	void remove_bits(int x) {
		int akt=1;
		for(int i=BITS;i>=0;i--) {
			int bit=(x&(1<<i))!=0;
			if(tree[akt][bit]==0) {
				return ;
			}
			sz[akt]--;
			akt=tree[akt][bit];
		}		
		sz[akt]--;
	}
	
	int biggest_xor_with(int x) {
		int opt=0;
		int akt=1;
		for(int i=BITS;i>=0;i--){
			int bit=(x&(1<<i))!=0;
			if(bit==1 && sz[tree[akt][0]]) {
				akt=tree[akt][0];
			}else if(bit==0 && sz[tree[akt][1]]) {
				opt|=1<<i;
				akt=tree[akt][1];
			}else {
				if(sz[tree[akt][0]]) akt=tree[akt][0];
				else if(sz[tree[akt][1]]) {
					opt|=1<<i;
					akt=tree[akt][1];
				}
				else return x;
			}
		}
		return opt;
	}
};

vector<pair<int,int>> adj[MAXN];

#define xx first
#define yy second
int dist[MAXN];
int st[MAXN];
void dfs(int x, int akt) {
    dist[x]=akt;
    st[x]=1;
    for(auto i:adj[x]) {
        if(!st[i.xx]) {
            dfs(i.xx, i.yy^akt);
        }
    }
}

trie tr;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    int n;
    cin>>n;
    for(int i=1;i<n;++i) {
        int a,b,c;
        cin>>a>>b>>c;
        adj[a].push_back({b,c});
        adj[b].push_back({a,c});
    }
    
    dfs(1,0);
    
    
    map<int,int> inv;
    for(int i=1;i<=n;++i) inv[dist[i]]=i, tr.insert_bits(dist[i]);
    for(int i=1;i<=n;++i) cout<<inv[tr.biggest_xor_with(dist[i])]<<" ";
    cout<<"\n";
    
    return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 94ms 213092 KiB
2 Elfogadva 93ms 213684 KiB
subtask2 20/20
3 Elfogadva 94ms 213612 KiB
4 Elfogadva 135ms 213660 KiB
5 Elfogadva 94ms 213736 KiB
6 Elfogadva 94ms 213780 KiB
7 Elfogadva 94ms 213816 KiB
8 Elfogadva 93ms 213860 KiB
9 Elfogadva 103ms 213900 KiB
10 Elfogadva 103ms 213944 KiB
11 Elfogadva 103ms 213992 KiB
12 Elfogadva 97ms 214108 KiB
13 Elfogadva 96ms 214108 KiB
14 Elfogadva 94ms 214120 KiB
15 Elfogadva 96ms 214156 KiB
16 Elfogadva 96ms 214188 KiB
subtask3 80/80
17 Elfogadva 393ms 234436 KiB
18 Elfogadva 405ms 236552 KiB
19 Elfogadva 481ms 238112 KiB
20 Elfogadva 455ms 239404 KiB
21 Elfogadva 455ms 241532 KiB
22 Elfogadva 483ms 243660 KiB
23 Elfogadva 428ms 245788 KiB
24 Elfogadva 400ms 247896 KiB
25 Elfogadva 412ms 249932 KiB
26 Elfogadva 384ms 252360 KiB
27 Elfogadva 398ms 254448 KiB
28 Elfogadva 402ms 255380 KiB
29 Elfogadva 421ms 257124 KiB
30 Elfogadva 412ms 259236 KiB
31 Elfogadva 414ms 261528 KiB
32 Elfogadva 414ms 265044 KiB
33 Elfogadva 432ms 267832 KiB
34 Elfogadva 428ms 272408 KiB
35 Elfogadva 395ms 268940 KiB
36 Elfogadva 419ms 270888 KiB
37 Elfogadva 402ms 272660 KiB
38 Elfogadva 411ms 274808 KiB
39 Elfogadva 416ms 276652 KiB
40 Elfogadva 391ms 278768 KiB