這是一種型別的動態點分治
動態點分治,關鍵還是要在均攤n的空間複雜度記憶體下所有東西。這個就要充分利用stl,比如vector
每乙個點存以這個點為根點分治的資訊。
對於詢問乙個點的路徑時,就是沿著點分治樹,不斷朝fa走,每走一層統計一下,因為分治樹可以保證在log層內,時間複雜度同階
卡常數無優化:43848ms
優化一:取模優化(x-=mod 代替 % ) + 迴圈展開+ 一部分inline :43612ms
第三次:將i++改為++i:速度稍減慢,dfs(int &u)佔位符加速也沒有體現出來
優化不下去了
#include#include#include#include#include#include#include#include#define fi first
#define se second
#define pii pair#define mk(a,b) make_pair((a),(b))
using namespace std;
typedef long long ll;
const int n=150005;
inline int read()
int n,q,a;ll ans;
int u,l,r;
/struct bian
}e;//
int age[n],fa[n];ll dis[n];
struct aa
return ans;
} int dis(int u)
int id(int u)
void init() }
void work(int u)
num++;
} }tt[u].init();
}void dfs(int u,int fat)
///void init()
return 0;
}
動態點分治 bzoj 3730,bzoj 1095
總結一下動態點分治的模板。對於乙個樹,把它點分的同時記錄每個點的所有父親 logn個 並記錄點距其父親的距離。具體實現就是dfs的時候fa x dep x u,dis x dep x d bzoj1095 您需要寫乙個程式支援反轉點的顏色,求距離最遠的黑色點對的距離。解析 在每個點u存乙個堆st記錄...
BZOJ3730 震波 動態點分治
include include include include include include define space putchar define enter putchar n using namespace std typedef long long ll template void rea...
BZOJ3730 震波 動態點分治
在一片土地上有n個城市,通過n 1條無向邊互相連線,形成一棵樹的結構,相鄰兩個城市的距離為1,其中第i個城市的價值為value i 不幸的是,這片土地常常發生 並且隨著時代的發展,城市的價值也往往會發生變動。0 x k 表示發生了一次 震中城市為x,影響範圍為k,所有與x距離不超過k的城市都將受到影...