題解 Journeys 線段樹優化連邊

2022-02-23 21:03:35 字數 2073 閱讀 2129

這張圖太直觀了,直接講透了線段樹優化連邊的原理和正確性。

考慮建立兩顆線段樹,一顆是外向樹,一顆是內向樹,相當於網路流建模一樣,我們可以利用這兩顆線段樹分別模擬乙個點的入度和出度。畢竟乙個點如果確定了它的入度和出度就相當於確定了在圖中的位置。

一條邊進入了乙個父親節點,相當於能進入它所有的兒子,這就模擬了入度。這和線段樹很像,於是我們就做成線段樹的樣子,每次加邊的時候,最多從外向樹選出\(o(\log n)​\)的節點,就可以模擬出區間新增入度的操作。為了真正落實可以免費進入兒子的效果,我們每個節點向兒子連一條邊權為0的邊。

一條邊從乙個父親節點出去,相當於他所有的兒子可以從這條邊出去,這就模擬了出度。這和線段樹很像,於是我們就做成線段樹的樣子,每次加邊的時候,最多從外向樹選出\(o(\log n)\)的節點,就可以模擬出區間新增出度的操作。為了真正落實可以免費從兒子出的效果,我們每個節點向父親連一條邊權為0的邊。

兩個操作加起來,就成功新增了一條有向邊,邊數是\(n\log n​\)級別的。

每次要加邊時,我們如果\(o(\log^2n)\)地加的話,就會導致邊數多乙個\(\log\),所以我們新建乙個點,再新增,就會用\(o(n)\)的點換來\(o(n \log n )\)的邊數了。

線段樹不一定真的要建出來(我覺得甚至用樹狀陣列或者迴圈控制都行啊,因為我們主要是要得到乙個二叉關係)。原圖我們就可以丟了,原圖的點就變成了外向樹的葉子節點,對於這兩顆線段樹一起看做乙個新圖操作就好了。

由於從同乙個點到同乙個點是不用花費任何代價的,但是我們也不能有自環,所以我們從每個節點的入度節點到出度節點連一條邊權為0的邊。

**人醜常數/記憶體都大,僅供參考。

//@winlere

#includeusing namespace std; typedef long long ll;

template < class ccf > inline ccf qr(ccf ret)inline int qr()

const int maxn=5e5;

int n,m,k,t;

int d[(int)(maxn*4.6)];

const int inf=1<<18;

typedef pair < int , int > p;

priority_queue < p , vector < p > , greater < p > > q;

struct ee(const int&a,const int&b,const int&c)};

vector < e > e;

vector < int > v1,v2;

int head[(int)(maxn*4.6)];

int cnt;

inline void add(const int&fr,const int&to,const int&w)

#define st first

#define nd second

#define midd register int mid=(l+r)>>1

#define lef l,mid,pos<<1

#define rgt mid+1,r,pos<<1|1

#define push(a,b) push(make_pair(a,b))

void build1(const int&l,const int&r,const int&pos)

void build2(const int&l,const int&r,const int&pos)

void que(vector < int >&ve,const int&l,const int&r,const int&l,const int&r,const int&pos)

}inline void add(const vector < int >&fr,const vector < int >&to)

int main()

que(v1,k,k,1,n,1);

dij(*v1.begin());

ans(1,n,1);

return 0;

}

線段樹 題解

nyoj 1068 題目鏈結 題目意思 典型的線段樹,插線問線.不過多了乙個,a 操作某乙個區間乙個數整體加上乙個數 s 操作查詢某乙個區間的總和,q 操作,查詢這個區間有多少個奇數.下面是 線段樹延遲更新,奇數的個數更新時注意 如果變化的是奇數,那麼 現在區間奇數個數 區間長度 原本區間的奇數個數...

線段樹優化dp

等離子炮有n個操作訊號,第i個操作訊號的強度為b i 總體強度為各操作訊號的強度之和。由於有些訊號太弱了了 強度 0 水寶寶想把它們刪除。但是水寶寶自己不會刪除訊號,所以他找來了同船的隊友幫忙。有 m位隊友,第ii 位隊友只會刪除編號在 l i 和 r i 之間的訊號,且每刪除乙個訊號,花費 c i...

題解 線段樹 關於時間

這是本蒟蒻的原創題 確實很簡單 本蒟蒻loj賬號diogenes 本題的難點在於每個操作會重複多次。核心思想是把第t秒的操作提前到第一秒,再減去多餘的部分。有一種構造方法 ad d i.j add i.j 表示區間 i j i,j 需要加的值。de l i.j del i.j 表示區間 i j i,...