bzoj 4912 Sdoi2017 天才黑客

2022-05-10 22:02:28 字數 1149 閱讀 1762

這個題和點沒什麼關係 , 之和邊與邊之間關係有關 , 我們就把邊看作點 , 邊權就是 \(lcp\) , 點權看作這條邊本來的權值.

現在考慮兩兩連邊 , \(lcp\) 就是兩個點在 \(trie\) 樹上的 \(lca\) 的深度.

這樣連邊是 \(o(m^2)\) 的 , 考慮優化 , 我們把乙個點的出邊和入邊都單獨拿出來 , 並按照 \(dfs\) 序排序 , 設排序之後的陣列為 \(q\).

設 \(h[i]=lcp(dep(lca(q[i],q[i+1])))\) , 那麼 \(lcp(i,j)=min(h[i],h[i+1]...h[j-1])\) , 這就是字尾陣列求 \(lcp\) 時的思想 , 把 \(height\) 陣列取 \(min\) .

由於是求最小值 , 我們只需要把所有可能的走法都構造出來 , 然後取 \(min\) 就行了.

於是這麼考慮 , 建立兩行虛點字首節點和字尾節點 , 從 \(q[i]\) 走到 \(q[i+1]\) 最多付出 \(h[i]\) 的代價 , \(dfs\) 序相鄰的連代價為 \(h[i]\) 的邊 , 並且把 \(dfs\) 序上的點都用虛點串起來 , 這樣跑最短路的時候就可以取 \(min\) 了.

#include#define i vector::iterator

using namespace std;

templatevoid gi(t &x)

const int n=1000010,inf=2e9;

vectorot[n],in[n];

int head[n],nxt[n*2],to[n*2],num=0,q[n],dfn[n],dfn=0;

int pl[n],pr[n],sl[n],sr[n],tt,dis[n*2],v[n];

inline void link(int x,int y,int z)

int n,m,k,d[n],dep[n],fa[n][20];

inline void dfs(int x)

}inline int lca(int x,int y)

inline bool comp(int i,int j)

for(int i=1;ij.v;}

priority_queueq;

inline void dj()

Bzoj 2726 SDOI 任務安排

memory limit 131072kb 64bit io format lld llu description 機器上有n個需要處理的任務,它們構成了乙個序列。這些任務被標號為1到n,因此序列的排列為1,2,3.n。這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工...

BZOJ 3991 SDOI2015 尋寶遊戲

題目大意 給定一棵樹,其中有若干個關鍵點,任意選擇起點,求從起點出發訪問所有關鍵點又回到起點的最小邊權總和,有m個修改操作,每次修改乙個關鍵點。假如沒有修改操作的話,就像乙個簡單的樹形dp,方程如下 f i sigma sigma.觀察一下dp的過程,就是不斷地從前面的點走到後面的點,所以我們可以不...

SDOI2013 BZOJ3203 保護出題人

description input 第一行兩個空格隔開的正整數n和d,分別表示關數和相鄰殭屍間的距離。接下來n行每行兩個空格隔開的正整數,第i 1行為ai和 xi,分別表示相比上一關在殭屍佇列排頭增加血量為ai 點的殭屍,排頭殭屍從距離房子xi公尺處開始接近。output 乙個數,n關植物攻擊力的最...