題意:
小 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...