当前位置: 代码迷 >> 综合 >> bzoj4134 (sg函数,线段树合并(trie))
  详细解决方案

bzoj4134 (sg函数,线段树合并(trie))

热度:62   发布时间:2024-01-04 12:42:52.0

 

trie合并,加sg函数。。。

 

这道题体现了dp思想处理博弈论问题,同时发现许多的书上信息合并问题可以考虑线段树合并。

也体现了,trie处理xor问题,也体现了trie处理mex问题。

 

 

 

#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<stack>
using namespace std;
const int N=100005;
const int D=19;int n;
int c[N];int head[N],tot,pre[N*2],to[N*2];
void addedge(int u,int v){to[++tot]=v;pre[tot]=head[u];head[u]=tot;}
int dp[N];
int num,rt[N],ch[N*41][2],rev[N*41],val[N*41];
void build(int &u,int tmp,int D) 
{if (u==0) u=++num;if (D==-1) {val[u]=1;return ;}build(ch[u][tmp>>D&1],tmp,D-1);
}
void down(int u,int D) 
{rev[ch[u][0]]^=rev[u];rev[ch[u][1]]^=rev[u];if (rev[u]&(1<<D)) swap(ch[u][0],ch[u][1]);rev[u]=0;
}
int merge(int u,int v,int D) 
{if (!u||!v)