本題在樹上,其實可以用trie樹水,我偏要線性基pwp
使用倍增減少複雜度。
我們在倍增lca陣列的基礎上多加一維維護線性基。
根據線性基性質(qwq),將乙個線性基插入另乙個線性基可以得到兩個數列合併後的線性基。
所以我們每次查詢用倍增跳的方式強行合併然後求最大就行。
#includeusing namespace std;
#define in read()
#define int long long
int in
while(isdigit(ch))return cnt*f;
}int first[200003],nxt[400003],to[400003],tot;
void add(int a,int b)
int n,q;
int p[20003][22][66],a[200003];
int fa[20003][22],dep[200003];
void insert(int *a,int x)
}void getlca() }}
int ans[66];
void lca(int x,int y)
} if(x==y)
for(int i=19;i>=0;i--)
} merge(ans,p[x][0]);merge(ans,p[y][0]);merge(ans,p[fa[x][0]][0]);
}void solve()
printf("%lld\n",sum); }
}signed main()
for(int i=1;idfs(1,0);
getlca();
solve();
return 0;
}
SCOI2016 幸運數字 點分治 線性基
更新提示 正文 description a 國共有 n 座城市,這些城市由 n 1 條道路相連,使得任意兩座城市可以互達,且路徑唯一。每座城市都有乙個幸運數字,以紀念碑的形式矗立在這座城市的正中心,作為城市的象徵。一些旅行者希望遊覽 a 國。旅行者計畫乘飛機降落在 x 號城市,沿著 x 號城市到 y...
SCOI2016 幸運數字
線性基合併o log 2n 不能更小 但是倍增o qlog 3n 可過233333 甚至樹剖o qlog 4n 可過666666 還有乙個樹上路徑查詢利器 點分治!詢問離線 列舉重心,處理路徑過重心的詢問 邊dfs邊插入線性基,維護每個點到根路徑上的線性基 每個詢問,如果所屬不同的子樹,那麼過當前重...
SCOI2016 幸運數字
不想說了.就樹上的線性基合併.但是講道理o nlogn 3 為什麼能過去呢.但是就是能過去啊,因為博主是菜雞不怎麼會澱粉質啊,所以本篇題解只能提供這個複雜度的演算法了qaq 求選出來一些數使得異或和最大?線性基啊!那怎麼求路徑上的呢?乙個乙個往上合併,一直合併到lca就行了吧!乙個乙個合併顯然不行,...