日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P3292-[SCOI2016]幸运数字【线性基,LCA,倍增】

發布時間:2023/12/3 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P3292-[SCOI2016]幸运数字【线性基,LCA,倍增】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P3292


題目大意

nnn個點的一棵樹,每個點都點權。每次詢問一條路徑,選擇若干個點的異或和最大。


解題思路

路徑上的如何進行計算,我們知道我們可以用倍增來計算權值和。我們可以把每個線性基視為邊權,然后加和就是線性基的合并。

合并線性基時我們將后面的所有did_idi?都插入到前面那個線性基中即可。

時間復雜度O((n+q)log3n)O((n+q)log^3 n)O((n+q)log3n)


codecodecode

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=21000,T=15; struct node{ll to,next; }a[N*2]; struct xxj{ll d[80];ll solve(){ll ans=0;for(ll i=60;i>=0;i--)if((ans^d[i])>ans)ans^=d[i];return ans;}void add(ll x){if(!x)return;for(ll i=60;i>=0;i--)if((x>>i)&1ll){if(d[i])x^=d[i];else{d[i]=x;return;}}} }w[N][T]; ll n,q,tot,ls[N],dep[N],g[N],f[N][T]; xxj operator+(const xxj &a,const xxj &b){xxj ans=a;for(ll i=0;i<=60;i++)if(b.d[i])ans.add(b.d[i]);return ans; } void addl(ll x,ll y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot; } void dfs(ll x){dep[x]=dep[f[x][0]]+1;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==f[x][0])continue;f[y][0]=x;dfs(y);}return; } void ycl(){for(ll i=1;i<=n;i++)w[i][0].add(g[i]);for(ll j=1;j<T;j++){for(ll i=1;i<=n;i++){f[i][j]=f[f[i][j-1]][j-1];w[i][j]=w[i][j-1]+w[f[i][j-1]][j-1];}}return; } ll LCA(ll x,ll y){xxj ans;memset(ans.d,0,sizeof(ans.d));if(dep[x]>dep[y])swap(x,y);for(ll i=T-1;i>=0;i--)if(dep[f[y][i]]>=dep[x])ans=ans+w[y][i],y=f[y][i];if(x==y){ans.add(g[x]);return ans.solve();}for(ll i=T-1;i>=0;i--)if(f[x][i]!=f[y][i])ans=ans+w[x][i]+w[y][i],x=f[x][i],y=f[y][i];ans=ans+w[x][0]+w[y][0];ans.add(g[f[x][0]]);return ans.solve(); } int main() {scanf("%lld%lld",&n,&q);for(ll i=1;i<=n;i++)scanf("%lld",&g[i]);for(ll i=1;i<n;i++){ll x,y;scanf("%lld%lld",&x,&y);addl(x,y);addl(y,x);}dfs(1);ycl();while(q--){ll x,y;scanf("%lld%lld",&x,&y);printf("%lld\n",LCA(x,y));} }

總結

以上是生活随笔為你收集整理的P3292-[SCOI2016]幸运数字【线性基,LCA,倍增】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。