題意:求\(u\)到\(v\)的最短路徑的不同權值種類個數
樹上莫隊試水題,這一篇是上篇的弱化部分,但可測試以下結論的正確性
設\(s(u,v)\):\(u-v\)最短路徑所覆蓋的點集
\(s(u,v)=s(root,u)⊕s(root,v)⊕lca(u,v)\)
記\(t(u,v)=s(root,u)⊕s(root,v)\)
每次轉移我們只考慮\(t\)的部分,\(lca\)單獨處理
對於某一次距離為1的轉移,如\(u→u'\)
\(t(u,u')=s(root,u)⊕s(root,u')\)
\(t(u',v)=s(root,u')⊕s(root,v)\)
\(t(u',v)=s(root,u)⊕s(root,v)⊕s(root,u)⊕s(root,u')=t(u,v)⊕t(u,u')\)
得出結論\(t(u',v)=t(u,v)⊕t(u,u')\)
#include#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define rrep(i,j,k) for(register int i=j;i>=k;i--)
#define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
#define print(a) printf("%lld",(ll)(a))
#define println(a) printf("%lld\n",(ll)(a))
#define printbk(a) printf("%lld ",(ll)(a))
using namespace std;
const int maxn = 2e5+11;
const int inf = 0x7fffffff;
typedef long long ll;
ll read()
while(ch>='0'&&ch<='9')
return x*f;
}int to[maxn<<1],nxt[maxn<<1],head[maxn],tot;
void init()
void add(int u,int v)
int color[maxn],belong[maxn],depth[maxn],dfn[maxn];
int stk[maxn],bit[32],limit,root,cnt,clock,top;
int anc[maxn][20];
maphaxi;
bool vis[maxn];
int ans,cntnum[maxn],ans[maxn];
struct qqq
}stk[++top]=u; num++;
return num;
}int lca(int u,int v)
for(int i=16;i>=0;i--)
}if(u==v) return u;
else return anc[u][0];
}void rev(int u)else
}void viss(int u,int v)
}int main()
rep(i,1,n-1)
root=1;
top=cnt=clock=0;
memset(anc,0,sizeof anc);
dfs(root,0,1);
if(top)
rep(i,1,m)
sort(q+1,q+1+m); ans=0;
int t=lca(q[1].u,q[1].v);
memset(vis,0,sizeof vis);
viss(q[1].u,q[1].v);
rev(lca(q[1].u,q[1].v));
ans[q[1].id]=ans;
rev(lca(q[1].u,q[1].v));
rep(i,2,m)
rep(i,1,m) println(ans[i]);
}return 0;
}
SPOJ COT2 樹上莫隊
以下路徑都不包含 lca lca 考慮當前知道路徑 u v u,v 的資訊,想要知道 t v t,v 的資訊,只需把 u t u,t 上的點狀態取反即可,那麼複雜度是和 u t u,t 的長度相關的。於是我們考慮把樹分塊,每當乙個點的子樹大小 n n就拎出來成為一塊。id i idi 表示i i 號...
SPOJ COT2 (樹上莫隊)
給你一棵大小為n nn的樹,每個點都有點權。現在有m mm個詢問,每個詢問給你乙個兩個數a,b a,ba,b,問你從點a aa到點b bb之間的路徑中不同的點權的個數。萬惡的spoj並沒有寫點權的資料範圍,害我我先re 此題需要離散化點權 求解帶有詢問的不同數的個數這類題,一看就相當莫隊 但是因為莫...
SPOJ COT2 (樹上莫隊)
給你一棵大小為 n 的樹,每個點都有點權。現在有 m 個詢問,每個詢問給你乙個兩個數 a,b 問你從點 a 到點 b 之間的路徑中不同的點權的個數。萬惡的spoj並沒有寫點權的資料範圍,害我我先re 此題需要離散化點權 求解帶有詢問的不同數的個數這類題,一看就相當莫隊 但是因為莫隊只能夠在乙個序列上...