社区讨论
#3#4#5AC 其他 WA 求调
P3292[SCOI2016] 幸运数字参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @m5j3i2f8
- 此快照首次捕获于
- 2025/01/05 12:11 去年
- 此快照最后确认于
- 2025/11/04 11:57 4 个月前
CPP
#define int long long
using namespace std;
#define fi first
#define sc second
#define pii pair<int,int>
#define pb push_back
#define umap unordered_map
#define mset multiset
#define pq priority_queue
#define ull unsigned long long
#define i128 __int128
const int maxn=2e4+10;
int n,m,a[maxn],f[maxn][17],dep[maxn];
vector<int> g[maxn];
struct XorBasic{
int xb[64];
bool zero=0;
void init(){
for(int i=0;i<=63;i++) xb[i]=0;
}
bool insert(int x){
// cout<<":"<<x<<endl;
for(int i=63;~i;i--){
if(x&(1ll<<i)){
if(!xb[i]) return xb[i]=x,1;
else x^=xb[i];
}
}
zero=1;
return 0;
}
int querymax(int num=0){
int maxx=num;
for(int i=63;~i;i--){
if(maxx&(1ll<<i)) continue;
maxx^=xb[i];
}
return maxx;
}
void debug(){
for(int i=0;i<=63;i++) if(xb[i]) cout<<xb[i]<<" ";
cout<<endl;
}
}x[maxn][17];
void merge(XorBasic &x1,XorBasic x2){
for(int i=0;i<=63;i++) if(x2.xb[i]) x1.insert(x2.xb[i]);
}
void dfs(int u,int fa){
f[u][0]=fa,x[u][0].insert(a[u]),dep[u]=dep[fa]+1;
for(int i=1;i<=16;i++){
f[u][i]=f[f[u][i-1]][i-1];
x[u][i]=x[u][i-1],merge(x[u][i],x[f[u][i-1]][i-1]);
}
for(int v:g[u]) if(v!=fa) dfs(v,u);
}
int query(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
int d=dep[u]-dep[v];
XorBasic res;
res.init();
res.insert(a[u]),res.insert(a[v]);
for(int i=16;~i;i--){
if(d&(1<<i)) merge(res,x[u][i]),u=f[u][i];
}
if(u==v) return res.insert(a[u]),res.querymax();
for(int i=16;~i;i--){
if(f[u][i]!=f[v][i]){
merge(res,x[u][i]),merge(res,x[v][i]);
u=f[u][i],v=f[v][i];
}
}
res.insert(a[f[u][0]]);
return res.querymax();
}
void solve(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1,u,v;i<n;i++) cin>>u>>v,g[u].pb(v),g[v].pb(u);
dfs(1,1);
while(m--){
int u,v;
cin>>u>>v,cout<<query(u,v)<<endl;
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t=1;
// cin>>t;
while(t--) solve();
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...