2020牛客暑假多校第七場補題

2021-10-09 02:27:21 字數 3642 閱讀 8726

題目大意是說對於一棵樹,初始所有點的權值 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...