考慮點分治,對於乙個子樹,求出每個點到根的距離並排序,用雙指標掃瞄,但這樣會把來自同乙個兒子的路徑也統計上去,再對每個兒子做一遍,減去即可。
#include#includeview code#include
#include
using
namespace
std;
typedef
long
long
ll;const
int n=40005
;char rb[1
<<21],*s,*t;
inline
char gc()
inline
intrd()
int g[n],to[n<<1],w[n<<1],nxt[n<<1],cnt=0
,sz[n],f[n],sum,rt,d[n],t[n],tot,k;
ll ans=0ll;
bool
vis[n],inq[n];
queue
q;inline
void add(int u,int v,int
c)void getrt(int u,int fa)
f[u]=max(f[u],sum-sz[u]);
if(f[u]u;
}inline ll calc(
int u,int
k) }
sort(t+1,t+tot+1
);
for(l=1,r=tot;l<=r;++l)
return
ans;
}void solve(intu)}
intmain()
k=rd();
getrt(
1,0);solve(rt);
printf(
"%lld
",ans);
return0;
}
洛谷P4178 Tree 分塊
給你一棵樹,以及這棵樹上邊的距離,問有多少對點它們兩者間的距離小於等於kkk。這道題是應該加強資料了。當然如果這道題不打算做點分治模板題的話可以不用 o n nlog n o n sqrt n log sqrt n o nn logn 分塊在洛谷優秀的o2o2 o2下過了。我們假設1 11為樹根,d...
洛谷p4178 點分治 線段樹
這道題目是點分治的題目,與模板題不一樣的是,這是要統計小於路徑長度為k的點對數。我們分析下與模板題的區別,模板要求的是路徑等於k的長度的路徑是否存在,然後統計的方法是對於每個重心 跟 求出各點與根的路徑,然後重心下面的各個子樹中,相同的子樹不去統計答案,去計算之前非該子樹的路徑能否湊出k的路徑,也就...
洛谷4178 BZOJ1468 Tree題解點分治
點分治的入門練習。題目鏈結 bzoj的鏈結 許可權題 關於點分治的思想我就不再重複了,這裡重點說一下如何判重。我們來看上圖,假設我們去除了1節點,求出d 2 1,d 3 d 4 2 假設k為5,這樣我們會認為節點 2,3 2,4 3,4 的距離小於k,從而累計到答案中 但是我們以2為root做點分治...