NOI模擬 Death(虛樹)

2021-08-17 16:32:24 字數 3451 閱讀 1320

題意:

小 f 墮入了夢魘的世界,乙隻巨大的魔爪,或者說,一棵根節點為 1 的有根樹,每個節點有

乙個危險值 wiwi

。 小 f 不會自己從夢境中醒來,她要在夢境中切斷自己與夢魘的聯絡,才能逃離這個世界。

每次,小 f 都是從 1 號節點進入這個世界。

她要去編號為x1

,x2.

..xkx1

,x2.

..xk

的節點上切斷聯絡。

她希望知道她要經過的所有節點的危險度之和最小是多少(多次經過只算一次)。

支援:

1. 1xw1x

w在編號為

x x

的點下加乙個危險值為

w w

的葉節點。

2. 2xw

' role="presentation" style="position: relative;">2xw

2xw令

fax fax

為此刻

x x

的父節點標號,在邊 (f

ax,x

)' role="presentation" style="position: relative;">(fa

x,x)

(fax

,x)上新建乙個危險值為

w w

的節點

z' role="presentation" style="position: relative;">z

z, 原

來的邊變為(f

ax,z

) (fa

x,z)

和(z,x)(z

,x

)3. 3

k 3kx1

x2..

.xk x1x

2...

xk

表示一次詢問,意義如題面所示。

題解:

虛樹,同時用splay維護dfs序,lct維護路徑和即可。

#include 

using

namespace

std;

typedef

long

long ll;

const

int rlen=1

<<18|1;

inline

char nc()

inline

int rd()

while(isdigit(ch))

return i*f;

}inline

void w(ll x)

if(x<0)

while(x)

while(buf[0])

}const

int n=4e5+50;

const

int inf=0x3f3f3f3f;

struct lct* lct;

struct splay* splay;

int n,m,cnt,w[n],fa[n],dfn[n];

ll lst;

vector

edge[n];

struct splay

inline

void pushdown()

inline

void upt()

}pool[n],*pos[n],*pool=pool,*rt;

inline node* newnode(int v)

inline

bool which(node *x)

inline

void rotate(node *x) else y->upt(); x->upt();

}inline

void splay(node *x,node *tar) rotate(x);

}if(tar==null) rt=x;

}inline

void inc(node *&x,node *fa,node *t)

inc(x->rc,x,t);

}inline

void dfs(int x,int f)

inline

void init()

inline

void

set(int x,int f)

inline node* suf_rt()

inline

void link(int x,int f)

inline

int get_dfn(int x)

inline node* get_pre(int x)

inline node* get_nxt(int x)

return splay(p,null), p;

}inline

void modify(int now,int x)

inline

int get_dep(int x)

};splay::node* splay::null;

struct lct

}pool[n],*pos[n],*pool=pool;

inline node* newnode(int v)

inline

bool isroot(node *x)

inline

bool which(node *x)

inline

void rotate(node *x) else y->upt(); x->upt();

}inline

void splay(node *x) rotate(x);

}

}inline

int access(node *x)

return lst-pool;

}inline

void init()

inline

void link(int x,int f)

inline

void cut(int x,int f)

inline

int get_lca(int x,int y)

inline

void

set(int x,int ww)

inline ll get_sum(int x,int f)

};lct::node* lct::null;

inline

int decode(int v)

int main() else

if(op==2) else

sort(vir_point+1, vir_point+vc+1, (int x,int y)

lst=0;

for(int i=1;i<=vc;i++)

lst+=w[1];

w(lst); putchar('\n');}}

}

noi2017 整數 線段樹or模擬

orzyyb 題目大意 你需要維護乙個有 3 times 10 7 個二進位制位的數,有一種修改方式和一種詢問方式 對這個數加上 a times2 b 其中 a 10 9 b 3 times 10 7 保證需要維護的這個數始終非負 詢問這個數第k個二進位制位的值 總共有 10 6 次詢問 修改操作 ...

noi2017 整數 線段樹or模擬

orzyyb 題目大意 你需要維護乙個有 3 times 10 7 個二進位制位的數,有一種修改方式和一種詢問方式 對這個數加上 a times2 b 其中 a 10 9 b 3 times 10 7 保證需要維護的這個數始終非負 詢問這個數第k個二進位制位的值 總共有 10 6 次詢問 修改操作 ...

NOI2017模擬4 2 查詢 線段樹

給出若干條線段,用 x1,y1 x2,y2 表示其兩端點座標,現在要求支援兩種操作 0 x1 y1 x2 y2 表示加入一條新的線段,x1,y1 x2,y2 1 x0 詢問所有線段中,x座標在x0處的最高點的y座標是什麼,如果對應位置沒有線段,則輸出0。o nlog 2n 的 include inc...