luogu3292 幸運數字

2022-06-07 19:27:13 字數 1085 閱讀 7542

考慮點分治,將詢問離線後計算重心到每乙個點的線性基,然後再詢問重心到每乙個點的線性基,時間複雜度為$o(3600q)$,可以過(然而太菜的我寫了倍增維護線性基,震驚於倍增和線性基常數之小)

1 #include2

using

namespace

std;

3#define n 20005

4#define oo 0x3f3f3f3f

5#define ll long long

6struct

jio,dp[n][21];9

struct

ji2edge[n<<1

];12

int e,n,m,x,y,head[n],in[n],out[n],f[n][21

];13

ll a[n];

14bool pd(int x,int

y)17

void add(int x,int

y)22

void add(ji &x,ll y)30}

31void merge(ji &x,ji y)

35void dfs(int k,int

fa)44

for(int i=head[k];i!=-1;i=edge[i].nex)

45if (edge[i].to!=fa)dfs(edge[i].to,k);

46out[k]=++x;47}

48 ji calc(int x,int

y)57

for(int i=20;i>=0;i--)

58if (!pd(f[y][i],x))

62 merge(z,dp[x][pd(x,y)^1

]);63

if (!pd(y,x))merge(z,dp[y][0

]);64

return

z;65}66

ll query(ji o)

72int

main()

81 dfs(1,1

);82

for(int i=1;i<=m;i++)

86 }

view code

Luogu 3292 SCOI2016 幸運數字

bzoj 4568。感覺很板。前置技能 線性基。放一篇感覺講的比較豐富的部落格 戳這裡。首先要求在乙個序列中任意選點使得異或和最大,當然是想到線性基了。把問題轉換到樹上,如果每次詢問的序列是兩點之間的路徑,也就是說我們只要提取出樹上一條路徑的線性基就可以了吧。發現線性基滿足可以快速合併這個性質,如果...

P3292 SCOI2016 幸運數字

lca倍增的途中,merge一下線性基。注意線性基是從自己開始,而倍增陣列fa i 0 等於father,意味著,線性基倍增的區間是左閉右開的,fa陣列是左閉右閉 include include include include include include include include incl...

P3292 SCOI2016 幸運數字 題解

這道題的解法是倍增 lca 線性基。下面假設你已經學會了倍增 lca 和線性基。首先回顧倍增 lca 的過程 通過倍增合併 f 到 f 上。實際上線性基也是可以合併的,合併方式就是將乙個線性基插入到另外乙個線性基裡面。因此既然線性基可以合併,那麼根據倍增 lca 的思路,我們同樣可以倍增合併線性基。...