題意:給乙個以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 然後...