題目連線:
題意:有n個點,標號為1∼n,用n−1條雙向帶權通道連線,保證任意兩個點能互相到達。
q次詢問,問從編號為x的點到達標號l∼r的點其中乙個點的最小距離是多少。
說明 :n,q<1e5,邊權<1e4;
思路:不難想到點分樹,儲存每個點到其「負責」的點的距離,這樣的話可以套線段樹,線段樹儲存其他點到點的距離。
但是,點分樹上有個需要解決的問題是:如果x順著點分樹向父親走,那麼在父親儲存的線段樹中要除去從兒子上來的那一部分(否則的話,不是簡單路徑,求出來的可能會錯)。 想了一下這裡很難實現,因為是取min操作,所以線段樹上二分估計也不行。 所以卡住了。
然後求問群友,群友提到了虛樹,我覺得此題的資料需要沒法實現。 後面猛地想通,我們不需要考慮「回走」這種情況,因為我們求的是最小距離,而非簡單路徑肯定是沒有簡單路徑優的。 那麼就是果然如標題所說,是個板子題了。
**實現:點分樹+線段樹+樹剖求lca。
點分樹里儲存的是自己作為重心時,會「負責」的點,即此時還沒有vis過的,且與自己連通的點。
所有經過「x」到達的點,儲存在了兩部分裡:一是x在點分樹里儲存的資訊。二是x在點分樹的祖先裡儲存的資訊(這一部分保留了x向上傳遞是資訊,所以大部分題要把這裡除去,此題由於是取min,可以不考慮)。
求lca:開始用了st表,但是感覺空間耗費太大,就改為了樹剖,跑起來還挺快。
#include#define rep(i,w,v) for(int i=w;i<=v;i++)#define for() for(int i=laxt[u];i;i=next[i])
using
namespace
std;
#define ll long long
#define rg register
#define maxn 100010
#define maxm 200010
#define inf 1e9
int fa[maxn],n,cnt;
int dep[maxn];bool
vis[maxn];
intlaxt[maxn],next[maxm],to[maxm],len[maxm];
intsiz[maxn],fcy[maxn],hson[maxn],top[maxn];
void add(int u,int v,int
len)
void dfs1(int u,int
ff)}
void dfs2(int u,int
tp)int lca(int u,int
v)int dis(int u,int v)
intfa[maxn],size,root,mx,rt[maxn];
void getroot(int u,int
ff) ret=max(ret,size-siz[u]);
if(retu;
}void dfs(int u,int
ff)}
struct
ins[maxn<<6]; int
tot;
void modify(int &now,int l,int r,int pos,int
val)
s[now].mn=min(s[now].mn,val);
if(l==r) return; int mid=(l+r)>>1
;
if(pos<=mid) modify(s[now].l,l,mid,pos,val);
else modify(s[now].r,mid+1
,r,pos,val);
}int query(int now,int l,int r,int l,int
r)void modify(intx)}
int query(int x,int l,int
r)
return
res;
}int
main()
dfs1(
1,0); dfs2(1,1
); size=mx=n;
getroot(
1,0); dfs(root,0
); rep(i,
1,n) modify(i);
int ans=0
,l,r,x;
scanf("%d
",&q);
while(q--)
return0;
}
ELK logstash 動態指定動態模板
基於 es 7.10.x 通過logstash寫到es的資料,es 預設匹配logstash 的模板,並且 索引 index 名稱也會自動加上logstash 預設的 logstash 模板為 get template logstash string string match properties ...
elasticsearch 動態模板
引數 path match path unmatch相反 引數用於匹配物件中字段的完整路徑,比如address.name可以匹配如下字段 curl xput localhost 9200 my index d 新增資料 curl xpost localhost 9200 my index my ty...
模板 動態DP
點此看題 動態 dp 的思路主要是用矩陣乘法加速 dp 所以首先要知道矩陣乘法的擴充套件版 c i,k max 令人震驚的是上面這東西也滿足結合律,現在我們來證明一下,假設有三個矩陣 a,b,c 相乘,大小分別是 n times m,m times p,p times q 我們把最終某乙個位置上的值...