From 514ec114cee74fe5590219e6e4a15ba70c8f0fb9 Mon Sep 17 00:00:00 2001 From: oncsr Date: Sat, 15 Nov 2025 11:23:10 +0900 Subject: [PATCH] =?UTF-8?q?[20251115]=20BOJ=20/=20P2=20/=20=EC=A0=90?= =?UTF-8?q?=ED=94=84=20=EC=A0=90=ED=94=84=202=20/=20=EA=B6=8C=ED=98=81?= =?UTF-8?q?=EC=A4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...355\224\204 \354\240\220\355\224\204 2.md" | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 "khj20006/202511/15 BOJ P2 \354\240\220\355\224\204 \354\240\220\355\224\204 2.md" diff --git "a/khj20006/202511/15 BOJ P2 \354\240\220\355\224\204 \354\240\220\355\224\204 2.md" "b/khj20006/202511/15 BOJ P2 \354\240\220\355\224\204 \354\240\220\355\224\204 2.md" new file mode 100644 index 00000000..be610167 --- /dev/null +++ "b/khj20006/202511/15 BOJ P2 \354\240\220\355\224\204 \354\240\220\355\224\204 2.md" @@ -0,0 +1,87 @@ +```cpp +#include +using namespace std; + +int N, S; +vector> v(100001), r(100001), g(100001); +stack st; +bitset<100001> vis; +int f[100001]{}, c[100001]{}, dp[100001]{}, deg[100001]{}; +set> s; + +void dfs1(int n) { + for(int i:v[n]) if(!vis[i]) { + vis[i] = 1; + dfs1(i); + } + st.push(n); +} + +void dfs2(int n, int k) { + f[n] = k; + c[k]++; + for(int i:r[n]) if(!vis[i]) { + vis[i] = 1; + dfs2(i,k); + } +} + +void dfs3(int n) { + for(int i:g[n]) { + deg[i]++; + if(!vis[i]) { + vis[i] = 1; + dfs3(i); + } + } +} + +int main() { + cin.tie(0)->sync_with_stdio(0); + + cin>>N; + for(int i=1,a;i<=N;i++) { + cin>>a; + if(i-a>=1) v[i].push_back(i-a), r[i-a].push_back(i); + if(i+a<=N) v[i].push_back(i+a), r[i+a].push_back(i); + } + cin>>S; + for(int i=1;i<=N;i++) if(!vis[i]) { + vis[i] = 1; + dfs1(i); + } + + vis.reset(); + int num = 0; + while(!st.empty()) { + int n = st.top(); st.pop(); + if(vis[n]) continue; + vis[n] = 1; + dfs2(n,++num); + } + + for(int i=1;i<=N;i++) for(int j:v[i]) { + if(f[i] != f[j] && !s.count(make_pair(f[i], f[j]))) { + g[f[i]].push_back(f[j]); + s.emplace(f[i], f[j]); + } + } + + vis.reset(); + dfs3(f[S]); + queue q; + q.push(f[S]); + dp[f[S]] = c[f[S]]; + int ans = 0; + while(!q.empty()) { + int n = q.front(); q.pop(); + ans = max(ans, dp[n]); + for(int i:g[n]) { + dp[i] = max(dp[i], dp[n] + c[i]); + if(!--deg[i]) q.push(i); + } + } + cout<