筆記 點分治

2022-03-30 07:06:25 字數 1407 閱讀 3162

基本思路:點分治,是一種針對可帶權樹上簡單路徑統計問題的演算法。對於乙個節點,只解決經過這棵子樹的根節點的路徑,對於子節點問題下推子樹。

//當初的主要問題是vis在幹什麼qwq,終於知道了

#include#include#include#define r register int

using namespace std;

#define ull unsigned long long

#define ll long long

#define pause (for(r i=1;i<=10000000000;++i))

#define in freopen("noipak++.in","r",stdin)

#define out freopen("out.out","w",stdout)

namespace fread inline bool isempty(const char& ch)

inline void gs(char* s)

} using fread::g; using fread::gs;

namespace jack const int n=10010,m=100,inf=1e+9;

int n,m,q[m],cnt,c,sum,rt,tot; bool ans[m],vis[n],mem[10000010];

int vr[n<<1],nxt[n<<1],fir[n],w[n<<1],d[n],mx[n],sz[n],buf[n],dis[n];

inline void add(int u,int v,int ww)

inline void getsz(int u,int fa) mx[u]=max(mx[u],sum-sz[u]);

if(mx[u]=dis[i])

ans[j]|=mem[q[j]-dis[i]];

for(r k=1;k<=cnt;++k) buf[++tot]=dis[k],mem[dis[k]]=true;

cnt=0;

} while(tot) mem[buf[tot]]=false,--tot;

for(r i=fir[u];i;i=nxt[i])

}inline void main() {

g(n),g(m); for(r i=1,u,v,w;i補一下點分治的一些題:

luogu p4178 tree

luogu p2634 [國家集訓隊]聰聰可可

luogu p2993 [fjoi2014]最短路徑樹問題

luogu p4149 [ioi2011]race

luogu p2056 [zjoi2007]捉迷藏

其實很多就是一些板子題,但是由於本人的**能力過弱,思路較差,還是要贅述一番。

2019.08.29

71

點分治 複習筆記

之前diaoye的一道題是要用點分治寫.但是我省選前臨時學的點分治,當時又只打了幾個板子,中間又沒有寫過有關的題,於是現在就似乎不太會了,剛好昨天又講了,今天就複習一下 引用講課pp t ppt 裡的一段話 點分治,是處理樹上路徑 連通塊的一種常見演算法。這一類問題有時可以通過lca來處理,但是有的...

學習筆記 點分治

點分治,其實應該叫 樹上點分治 主要用於解決 樹上路徑問題 我亂起的名字 比如,樹上是否存在長為 k 的路徑,樹上長小於 k 的路徑有多少條等等.點分治可以概括為 分治 重心 桶 就目前我做過的幾道題來說都是這個套路 我們就直接針對一道題來吧.詢問樹上距離為 k 的點對是否存在 換句話說,就是樹上是...

點分治 動態點分治

實在拖得太久了。先扔掉資料 分治的核心是盡量把乙個整體分成接近的兩個部分,這樣遞迴處理可以讓複雜度從n 變成nlogn。兩個問題,如何區分和如何算答案。對於第乙個問題,重心,然後就是找重心的方法,兩個dfs,對於第二個問題,對於每個重心算當前塊中每個點到重心的答案,然後由重心分開的塊要把多餘的資訊去...