CF888G Xor-MST
题目大意是:
每两个点之间的边权是两个点的异或值,求最小生成树
版子题,用01trie做
#pragma GCC optimize(2) #pragma GCC optimize(3,"Ofast","inline") #include#define inf 0x7fffffff #define ll long long //#define int long long //#define double long double #define re register int #define void inline void #define eps 1e-8 //#define mod 1e9+7 #define ls(p) p<<1 #define rs(p) p<<1|1 #define pi acos(-1.0) #define pb push_back #define P pair < int , int > #define mk make_pair using namespace std; const int mod=998244353; const int M=1e9; const int N=8e6+5;//?????????? 4e8 int L[N],R[N],ch[N][2],tot; int n,a[N],rt; void insert(int &p,int x,int dep) { if(!p) p=++tot; L[p]=min(L[p],x),R[p]=max(R[p],x); if(dep<0) return; int b=(a[x]>>dep)&1; insert(ch[p][b],x,dep-1); } int ask(int p,int val,int dep) { if(dep<0) return 0; int b=(val>>dep)&1; if(ch[p][b]) return ask(ch[p][b],val,dep-1); return ask(ch[p][b^1],val,dep-1)+(1< >n; for(re i=1;i<=n;i++) scanf("%lld",&a[i]); sort(a+1,a+n+1); memset(L,0x7f,sizeof(L)); for(re i=1;i<=n;i++) insert(rt,i,30); cout< >T; for(int index=1;index<=T;index++) { // printf("Case #%lld: ",index); solve(); // puts(""); } return 0; }



