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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ4568 : [Scoi2016]幸运数字

發(fā)布時(shí)間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ4568 : [Scoi2016]幸运数字 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

樹的點(diǎn)分治,每次求出重心后,求出重心到每個(gè)點(diǎn)路徑上的數(shù)的線性基。

對(duì)于每個(gè)詢問,只需要暴力合并兩個(gè)線性基即可。

時(shí)間復(fù)雜度$O(60n\log n+60^2q)$。

?

#include<cstdio> typedef long long ll; const int N=20010,M=200010,E=M*30; int n,m,i,x,y,g[N],v[N<<1],nxt[N<<1],ok[N<<1],ed; int all,f[N],son[N],now,pos[N]; int G[N],V[E],NXT[E],ED,p[M],cnt; ll a[N],ans[M]; struct Q{int x,y;}q[M]; struct B{ll a[60];B(){for(int i=0;i<60;i++)a[i]=0;}inline void ins(ll x){for(int i=59;~i;i--)if(x>>i&1){if(a[i])x^=a[i];else{a[i]=x;break;}}}inline ll ask(){ll t=0;for(int i=59;~i;i--)if((t^a[i])>t)t^=a[i];return t;} }h[N],b; inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';} inline void read(ll&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';} inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];ok[ed]=1;g[x]=ed;} inline void ADD(int x,int y){V[++ED]=y;NXT[ED]=G[x];G[x]=ED;} void findroot(int x,int y){son[x]=1;f[x]=0;for(int i=g[x];i;i=nxt[i])if(ok[i]&&v[i]!=y){findroot(v[i],x);son[x]+=son[v[i]];if(son[v[i]]>f[x])f[x]=son[v[i]];}if(all-son[x]>f[x])f[x]=all-son[x];if(f[x]<f[now])now=x; } void dfs(int x,int y,int z){pos[x]=z;h[x]=h[y];h[x].ins(a[x]);for(int i=g[x];i;i=nxt[i])if(ok[i]&&v[i]!=y)dfs(v[i],x,z); } void solve(int x){if(!G[x])return;f[0]=all=son[x],findroot(x,now=0);int i;pos[now]=now;h[now]=B();h[now].ins(a[now]);for(i=g[now];i;i=nxt[i])if(ok[i])dfs(v[i],now,v[i]);for(cnt=0,i=G[x];i;i=NXT[i])p[++cnt]=V[i];G[x]=0;for(i=1;i<=cnt;i++)if(pos[q[p[i]].x]==pos[q[p[i]].y])ADD(pos[q[p[i]].x],p[i]);else{b=h[q[p[i]].x];B*y=h+q[p[i]].y;for(int j=59;~j;j--)if(y->a[j])b.ins(y->a[j]);ans[p[i]]=b.ask();}for(i=g[now];i;i=nxt[i])if(ok[i])ok[i^1]=0,solve(v[i]); } int main(){read(n),read(m);for(ed=i=1;i<=n;i++)read(a[i]);for(i=1;i<n;i++)read(x),read(y),add(x,y),add(y,x);for(i=1;i<=m;i++){read(q[i].x),read(q[i].y);if(q[i].x==q[i].y)ans[i]=a[q[i].x];else ADD(1,i);}son[1]=n;solve(1);for(i=1;i<=m;i++)printf("%lld\n",ans[i]);return 0; }

  

總結(jié)

以上是生活随笔為你收集整理的BZOJ4568 : [Scoi2016]幸运数字的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。