題目大意是說對於一棵樹,初始所有點的權值 f(x
)f(x)
f(x)
為0,有三種操作:①對於結點 x
xx, 給定乙個值 w
ww,然後對於樹上所有結點 y
yy, 權值加上 w−d
ist(
x,y)
w - dist(x, y)
w−dist
(x,y
)(包括本身);② 對於結點 x,f
(x)=
min(
x,0)
x, f(x) = min(x, 0)
x,f(x)
=min
(x,0
);③詢問 f(x
)f(x)
f(x)
。對於操作①的轉化很巧妙:w−d
ist(
x,y)
=w−d
ep(x
)−de
p(y)
+2de
p(lc
a(x,
y)
)w - dist(x, y) = w - dep(x) - dep(y) + 2dep(lca(x,y))
w−dist
(x,y
)=w−
dep(
x)−d
ep(y
)+2d
ep(l
ca(x
,y))
,其中每次①操作的 w−d
ep(x
)w - dep(x)
w−dep(
x)都可以記錄下來,dep
(y
)dep(y)
dep(y)
也是乙個定值,而對於 dep
(lca
(x,y
))
dep(lca(x, y))
dep(lc
a(x,
y)), 可以用樹剖來記錄,若記根節點 rtrt
rt深度為 1,只需要讓結點 x
xx 到根結點路徑上的結點加上 2,dep
(lca
(x,y
))
dep(lca(x, y))
dep(lc
a(x,
y))就是結點 y
yy 到根結點的權值和。
然後對於操作②,若是某個結點的權值大於 0, 我們可以用陣列去記錄減去的數是多少。
剛學的樹剖模板,千萬不要忘記初始化
#include
#define pb push_back
using
namespace std;
typedef
long
long ll;
typedef pair<
int,
int> p;
const
int maxn =
5e4+10;
const
int inf =
0x3f3f3f3f
;const ll mod =
998244353
;int n, m;
struct edge //鏈式前向星
e[maxn*2]
;int head[maxn]
, num;
//head為0表示搜尋到了盡頭
void
add_edge
(int u,
int v)
ll tree[maxn<<2]
, lazy[maxn<<2]
, dfn[maxn]
;//線段樹模板
void
build
(int node,
int l,
int r)
int mid =
(l + r)/2
;build
(node *
2, l, mid)
;build
(node *2+
1, mid +
1, r)
; tree[node]=0
; lazy[node]=0
;}void
push_down
(int node,
int length)
}ll query
(int node,
int l,
int r,
int x,
int y)
void
update
(int node,
int l,
int r,
int x,
int y,
int c)
push_down
(node, r - l +1)
;int mid =
(l + r)/2
;if(x <= mid)
update(2
*node, l, mid, x, y, c);if
(y > mid)
update(2
* node +
1, mid +
1, r, x, y, c)
; tree[node]
= tree[node *2]
+ tree[node *2+
1];}
int siz[maxn]
, son[maxn]
, top[maxn]
, dep[maxn]
, faz[maxn]
, id[maxn]
, tol;
void
dfs1
(int x)
}void
dfs2
(int x,
int rt)
}void
updrange
(int u,
int v,
int val)
if(dep[u]
> dep[v]
)swap
(u, v)
;//讓u為深度淺的那個點
update(1
,1, n, id[u]
, id[v]
, val);}
ll qrange
(int u,
int v)
if(dep[u]
> dep[v]
)swap
(u, v)
;//讓u為深度淺的那個點
ans +
=query(1
,1, n, id[u]
, id[v]);
return ans;
}ll pre[maxn]
;int
main()
dep[1]
=1;dfs1(1
);dfs2(1
,1);
build(1
,1, n)
;int cnt =0;
ll cur =
0, tmp;
for(
int i =
1; i <= m; i++
)else
if(mark ==2)
else}}
}
2020牛客多校第七場H
題目鏈結 任何 1,k 是有效答案。如果 n,k 是有效答案,那麼 n k,k 和 n k,k 都是有效答案。給出t組,n和k 範圍1 1e12 求出 n,k 在n n,k k範圍內的有效個數。在k不變的情況下,n的取值範圍只可能是k的倍數,或者k的倍數 1,可以o 1 算出當前k對應的答案個數。即...
2020牛客多校第七場H Dividing
正整數二元組 legend tuple n,k 是這樣定義的 統計有多少個 legend tuple n,k 滿足 1 n n,1 k k,其中 n 和 k 是不超過 10 12 的整數 可以很容易發現答案即為n k 0,或者 n 1 k 0的對數 對於一部分k,n k是相等的,所以可以直接整除分塊...
2020 牛客暑假訓練營補題 (第七場)
暑假還是不能摸魚了,盡量每天補一道題。這裡大部分的補題應該都是參考了大佬的題解,所以如果有大佬看到了自己的解法,請多多包涵。題目意思便是給出幾個數。對於每乙個數n進行乙個判斷,求1 n的平方和是不是乙個平方數。是則輸出一行fake news 不是則輸出nobody knows it better t...