4568 Scoi2016 幸運數字

2021-08-03 20:20:04 字數 1114 閱讀 7733

又是一道線性基的題目。。

我們只需要對這棵樹維護乙個倍增的線性基就可以了,方法類似於lca的求法

至於怎麼合併兩個線性基,我們只需要將兩個基的全部數字拿出來,然後在重新插進去乙個新的基就可以了

注意細節。。

我一開始因為陣列開小了還wa了一發。。

code:

#include#include#define swap(x,y)

typedef long long ll;

const ll n=20005;

ll n,q;

ll a[n];

struct qq

e[n*2];ll num,last[n];

void init (ll x,ll y)

ll fa[n][21],lalal[n][21][65],dep[n];//祖先 線性基 深度

void ins (ll x,ll y,ll xx)

xx=xx^lalal[x][y][u];

}}void merge (ll x,ll y,ll x1,ll y1)//我現在要更新x y這個地方 用的是將x1y1吃掉

void dfs (ll x,ll fa)

//printf("yes:%lld %lld\n",x,y);

if (x!=y)

merge(ans,0,x,0);

merge(ans,0,y,0);

x=fa[x][0];

} ins(ans,0,a[x]);

ll ans=0;

for (ll u=62;u>=0;u--)

if ((ans^lalal[ans][0][u])>ans) ans^=lalal[ans][0][u];

printf("%lld\n",ans);

}int main()

{ memset(lalal,0,sizeof(lalal));

num=0;memset(last,-1,sizeof(last));

scanf("%lld%lld",&n,&q);

ans=n+1;

for (ll u=1;u<=n;u++) scanf("%lld",&a[u]);

for (ll u=1;u

4568 Scoi2016 幸運數字

time limit 60 sec memory limit 256 mb submit 765 solved 305 submit status discuss a 國共有 n 座城市,這些城市由 n 1 條道路相連,使得任意兩座城市可以互達,且路徑唯一。每座城市都有乙個 幸運數字,以紀念碑的形式...

BZOJ4568 Scoi2016 幸運數字

樹上查兩點間最大異或和 樹倍增,每個點維護向上2 k個點的線性基,然後在查lca的時候合併 關於點權維護倍增略蛋疼 合併線性基的時候就直接把乙個線性基里的插到另乙個裡 複雜度o m log n log 2inf 合併的時候加點優化可以降掉乙個loginf 接下來bb一些有關線性基和最大異或和的東西 ...

BZOJ 4568 Scoi2016 幸運數字

題目大意 給你一顆樹,多個詢問,問你樹上任意兩點的路徑上選任意幾個點使得異或和最大。我是參考的claris大神的 點分治,對於詢問在兩個子樹間或者有乙個在重心上的進行回答,否則把問題用鍊錶接到詢問點所在的子樹上。具體方法可以選中重心都對每個子樹染色,染為這個子樹的根節點。在子樹處理問題之前一定要記住...