基本思路:點分治,是一種針對可帶權樹上簡單路徑統計問題的演算法。對於乙個節點,只解決經過這棵子樹的根節點的路徑,對於子節點問題下推子樹。
//當初的主要問題是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,對於第二個問題,對於每個重心算當前塊中每個點到重心的答案,然後由重心分開的塊要把多餘的資訊去...