SCOI2016 幸運數字

2022-05-19 02:33:15 字數 1401 閱讀 8823

題意:

給定一棵n個點的樹,每個點有點權$g_u$。

你需要回答q次詢問,每次詢問一條路徑$(u,v)$上選一些點的最大異或和。

$n\leq 20000,q\leq 200000,g_u \leq 2^$。

題解:二合一板子題。寫了個樹剖發現$o(n\log^)$能過,我也不知道咋回事。

點分治可以做到$o(n\log^n)$,不過我懶得寫了。

小技巧:線性基嚴重不滿,暴力插入的時候判一下是不是0。

套路:**:

#include#define maxn 20005

#define maxm 65

#define inf 0x7fffffff

#define ll long long

#define rint register ll

#define debug(x) cerr<

namespace

std;

ll n,m=61,q,hd[maxn],to[maxn<<1],nxt[maxn<<1

];ll g[maxn],tp[maxn],cnt;

struct

basis

inline

void ins(ll x)}}

};inline ll read()

inline

void

addedge(ll u,ll v)

inline basis merge(basis x,basis y)

struct

segmentree

}inline

void

dfs2(ll u,ll t)

}inline

void

build(ll l,ll r,ll k)

ll mid=l+r>>1

; build(l,mid,k

<<1),build(mid+1,r,k<<1|1

); tr[k]=merge(tr[k<<1],tr[k<<1|1

]); }

inline basis qry(ll x,ll y,ll l,ll r,ll k)

inline basis calc(ll u,ll v)

if(dep[u]>dep[v]) swap(u,v);

res=merge(res,qry(rk[u],rk[v],1,n,1

));

return

res;

}}tr;

intmain()

tr.dfs1(

1,0),tr.dfs2(1,1),tr.build(1,n,1

);

while(q--)

return0;

}

幸運數字

SCOI2016 幸運數字

線性基合併o log 2n 不能更小 但是倍增o qlog 3n 可過233333 甚至樹剖o qlog 4n 可過666666 還有乙個樹上路徑查詢利器 點分治!詢問離線 列舉重心,處理路徑過重心的詢問 邊dfs邊插入線性基,維護每個點到根路徑上的線性基 每個詢問,如果所屬不同的子樹,那麼過當前重...

SCOI2016 幸運數字

不想說了.就樹上的線性基合併.但是講道理o nlogn 3 為什麼能過去呢.但是就是能過去啊,因為博主是菜雞不怎麼會澱粉質啊,所以本篇題解只能提供這個複雜度的演算法了qaq 求選出來一些數使得異或和最大?線性基啊!那怎麼求路徑上的呢?乙個乙個往上合併,一直合併到lca就行了吧!乙個乙個合併顯然不行,...

SCOI2016 幸運數字

題目 來寫乙個 3 個 log 的垃圾做法 其實非常顯然就是倍增把這條路徑處理一遍,之後維護出倍增陣列的線性基,大力合併就好了 線性基合併就是把乙個線性基的所有元素都拿出來,乙個乙個插入到另外乙個中去 include include include include define maxn 20005...