考慮點分治,將詢問離線後計算重心到每乙個點的線性基,然後再詢問重心到每乙個點的線性基,時間複雜度為$o(3600q)$,可以過(然而太菜的我寫了倍增維護線性基,震驚於倍增和線性基常數之小)
1 #include2view codeusing
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 }
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 的思路,我們同樣可以倍增合併線性基。...