SPOJ COT2 離線路徑統計

2022-05-07 03:30:09 字數 2031 閱讀 5120

題意:求\(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 此題需要離散化點權 求解帶有詢問的不同數的個數這類題,一看就相當莫隊 但是因為莫隊只能夠在乙個序列上...