牛客暑期多校訓練營2020第4場

2021-10-08 12:20:38 字數 3450 閱讀 7584

題意:給乙個以1為根的樹,定義乙個點的 「ancient distance」(祖先距離) 為該點到最近的被標記的祖先的距離。對於i (1≤i

≤n

1\le i\le n

1≤i≤

n),求標記i個點時,整棵樹上的 「ancient distance」 的最大值的最小值(設為xi)。輸出xi的和。

思路:假設已知整棵樹上的 「ancient distance」 的最大值的最小值x,那麼求出最少需要的標記節點個數即可。對此,可以貪心求出樹上最深的節點,向上跳x層,到達祖先y,將y的整棵子樹刪除。在新樹上重複這樣的操作直到整棵樹被刪除。那麼如何滿足查詢最深和刪除乙個子樹的操作呢?將原樹按照dfs序放入線段樹中,每次將乙個連續的區間標記為0即可。注意處理完一次詢問後要恢復原樹,記錄下處理過哪些節點就可以了。

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace std;

const

int n =

2e5+10;

struct edge

edge

(int x,

int y)

}edge[n]

;int tr[n *4]

, t[n]

, dfn[n]

, en[n]

, ha[n]

, dep[n]

,fa[n][22

], ans[n]

, stk[n]

;int cnt, tot;

void

clear

(int n)

void

addedge

(int x,

int y)

void

dfs(

int x)

en[x]

= cnt;

}void

get_fa

(int n)

void

pushup

(int x)

void

build

(int x,

int l,

int r)

int mid =

(l + r)

>>1;

build

(x *

2, l, mid)

;build

(x *2+

1, mid +

1, r)

;pushup

(x);

}void

update

(int x,

int l,

int r,

int ll,

int rr,

int v)

else tr[x]=0

;return;}

int mid =

(l + r)

>>1;

update

(x *

2, l, mid, ll, rr, v)

;update

(x *2+

1, mid +

1, r, ll, rr, v)

;pushup

(x);

}int

find_fa

(int x,

int num)if(

!x) x =1;

return x;

}int

solve

(int num,

int n)

for(

int i =

1; i <= key; i++

)update(1

,1, n, dfn[stk[i]

], en[stk[i]],

1);return key;

}int

main()

dep[1]

=1;dfs(1

);build(1

,1, n)

;get_fa

(n);

for(

int i =

0; i < dep[tr[1]

]; i++

) ans[i]

=solve

(i, n)

;int j = dep[tr[1]

];for(

int i =

1; i <= n; i++

)printf

("%lld\n"

,nans)

;clear

(n);

}return0;

}

題意:f(s, l, r)是將s[l, r]取出,生成s『,s』[j] = maxl≤i

≤r_l≤

i≤r​

s[i + l -1]。a=,求a中本質不同的子串的個數。

思路:廣義字尾自動機。倒著建,遇到需要改的時候,跳到第乙個不同的地方去改,每個位置最多只能被改10次。

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace std;

const

int n=

2e6+10;

int ch[n][21

],fa[n]

,las[n]

,h[n][21

],pos[n]

;ll len[n]

;char s[n]

;int tot=1;

intinsert

(int c,

int last)

}int q=

++tot;

len[q]

=len[p]+1

;while

(p&&

!ch[p]

[c]) ch[p]

[c]=q,p=fa[p];if

(!p) fa[q]=1

;else

}return q;

}ll solve()

intmain()

h[i]

[s[i]

-'a'

]=i;

} las[n+1]

=1;for

(int i=n;i>

0;i--)}

printf

("%lld"

,solve()

);return0;

}

牛客暑期多校訓練營B Boundary

給定n個點,然後確定乙個過原點的圓,要使這n個點盡可能多的存在與圓上,最後輸出最多的存在於圓上的點的個數 三點確定乙個圓,我們已知這個圓必定經過原點,所以再依次利用三點求圓心的公式列舉每兩個點與原點 三點不共線 確定的圓心,最後選擇確定次數最多的圓心構成的圓 include include incl...

2020牛客暑期多校訓練營(第五場)

總結 f題添老師一發ac,i 題起初不會做在想怎麼化簡那個式子,後來就直接畫出了最優的圖,然後猜了一發2 3過了。ef 一級目錄 一級目錄 一級目錄 乙個包括n個音符的陣列,音符按下標1 n排列,表示音符由低到高。有兩個操作 drop 2 將第二高的音符移到最低的位置 即將倒數第二個移到第乙個。in...

2020牛客暑期多校訓練營(第九場)

總結 這一場過了a題,之前用c 各種寫,但是沒想到用 三行 就解決了問題,還是需要學習很多很多。fi 一級目錄 土撥鼠在第1個宿舍,橙子在第n個宿舍。這n個宿舍間有n 1條路並且長度都為1,土撥鼠從第1個房間去第n個宿舍,速度為1m s 橙子從第n個宿舍追趕土撥鼠,速度為2m s。二分時間 t 然後...