SCOI2016 幸運數字

2022-04-26 01:12:07 字數 1282 閱讀 8625

不想說了......就樹上的線性基合併.......

但是講道理o(nlogn^3)為什麼能過去呢.......但是就是能過去啊,因為博主是菜雞不怎麼會澱粉質啊,所以本篇題解只能提供這個複雜度的演算法了qaq$$

求選出來一些數使得異或和最大?線性基啊!那怎麼求路徑上的呢?乙個乙個往上合併,一直合併到lca就行了吧!

乙個乙個合併顯然不行,我們考慮倍增。怎麼倍增呢?就和lca差不多......具體可以看一下**。

需要注意的是我們的\(p[i][j]\)表示的是從這個點出發,往上面合併\(2^j\)個線性基的意思,所以\(p[i][0]\)表示的是該點的線性基,所以倍增合併的時候,最後還要合併一下自己。

#include#include#include#include#include#define maxn 20010

using namespace std;

inline long long read()

while(ch>='0'&&ch<='9')

return x*f;

}int n,m,t;

int fa[maxn][16],dep[maxn],head[maxn];

long long p[maxn][16][62],sum[maxn];

struct edgeedge[maxn<<1];

inline void add(int from,int to)

inline void dfs(int x,int pre)

}inline void insert(long long *a,long long x)}}

}inline void merge(long long *a,long long *b)

inline long long get_ans(long long *a)

inline void init()

}}inline long long __lca(int x,int y)

}merge(ans,p[x][0]),merge(ans,p[y][0]);

merge(ans,p[fa[x][0]][0]);

return get_ans(ans);

}int main()

dfs(1,0);

init();

// for(int i=1;i<=n;i++) printf("%lld\n",get_ans(p[i][0]));

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

return 0;

}

SCOI2016 幸運數字

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

SCOI2016 幸運數字

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

SCOI2016 幸運數字

題意 給定一棵n個點的樹,每個點有點權 g u 你需要回答q次詢問,每次詢問一條路徑 u,v 上選一些點的最大異或和。n leq 20000,q leq 200000,g u leq 2 題解 二合一板子題。寫了個樹剖發現 o n log 能過,我也不知道咋回事。點分治可以做到 o n log n ...