2832021-06-22 15:43:57mraronMultiplikátoros telebabrátorcpp14Elfogadva 100/100483ms278768 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ÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva94ms213092 KiB
2Elfogadva93ms213684 KiB
subtask220/20
3Elfogadva94ms213612 KiB
4Elfogadva135ms213660 KiB
5Elfogadva94ms213736 KiB
6Elfogadva94ms213780 KiB
7Elfogadva94ms213816 KiB
8Elfogadva93ms213860 KiB
9Elfogadva103ms213900 KiB
10Elfogadva103ms213944 KiB
11Elfogadva103ms213992 KiB
12Elfogadva97ms214108 KiB
13Elfogadva96ms214108 KiB
14Elfogadva94ms214120 KiB
15Elfogadva96ms214156 KiB
16Elfogadva96ms214188 KiB
subtask380/80
17Elfogadva393ms234436 KiB
18Elfogadva405ms236552 KiB
19Elfogadva481ms238112 KiB
20Elfogadva455ms239404 KiB
21Elfogadva455ms241532 KiB
22Elfogadva483ms243660 KiB
23Elfogadva428ms245788 KiB
24Elfogadva400ms247896 KiB
25Elfogadva412ms249932 KiB
26Elfogadva384ms252360 KiB
27Elfogadva398ms254448 KiB
28Elfogadva402ms255380 KiB
29Elfogadva421ms257124 KiB
30Elfogadva412ms259236 KiB
31Elfogadva414ms261528 KiB
32Elfogadva414ms265044 KiB
33Elfogadva432ms267832 KiB
34Elfogadva428ms272408 KiB
35Elfogadva395ms268940 KiB
36Elfogadva419ms270888 KiB
37Elfogadva402ms272660 KiB
38Elfogadva411ms274808 KiB
39Elfogadva416ms276652 KiB
40Elfogadva391ms278768 KiB