Skip to content

Commit 514ec11

Browse files
authored
[20251115] BOJ / P2 / 점프 점프 2 / 권혁준
1 parent d8ee862 commit 514ec11

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
```cpp
2+
#include <bits/stdc++.h>
3+
using namespace std;
4+
5+
int N, S;
6+
vector<vector<int>> v(100001), r(100001), g(100001);
7+
stack<int> st;
8+
bitset<100001> vis;
9+
int f[100001]{}, c[100001]{}, dp[100001]{}, deg[100001]{};
10+
set<pair<int, int>> s;
11+
12+
void dfs1(int n) {
13+
for(int i:v[n]) if(!vis[i]) {
14+
vis[i] = 1;
15+
dfs1(i);
16+
}
17+
st.push(n);
18+
}
19+
20+
void dfs2(int n, int k) {
21+
f[n] = k;
22+
c[k]++;
23+
for(int i:r[n]) if(!vis[i]) {
24+
vis[i] = 1;
25+
dfs2(i,k);
26+
}
27+
}
28+
29+
void dfs3(int n) {
30+
for(int i:g[n]) {
31+
deg[i]++;
32+
if(!vis[i]) {
33+
vis[i] = 1;
34+
dfs3(i);
35+
}
36+
}
37+
}
38+
39+
int main() {
40+
cin.tie(0)->sync_with_stdio(0);
41+
42+
cin>>N;
43+
for(int i=1,a;i<=N;i++) {
44+
cin>>a;
45+
if(i-a>=1) v[i].push_back(i-a), r[i-a].push_back(i);
46+
if(i+a<=N) v[i].push_back(i+a), r[i+a].push_back(i);
47+
}
48+
cin>>S;
49+
for(int i=1;i<=N;i++) if(!vis[i]) {
50+
vis[i] = 1;
51+
dfs1(i);
52+
}
53+
54+
vis.reset();
55+
int num = 0;
56+
while(!st.empty()) {
57+
int n = st.top(); st.pop();
58+
if(vis[n]) continue;
59+
vis[n] = 1;
60+
dfs2(n,++num);
61+
}
62+
63+
for(int i=1;i<=N;i++) for(int j:v[i]) {
64+
if(f[i] != f[j] && !s.count(make_pair(f[i], f[j]))) {
65+
g[f[i]].push_back(f[j]);
66+
s.emplace(f[i], f[j]);
67+
}
68+
}
69+
70+
vis.reset();
71+
dfs3(f[S]);
72+
queue<int> q;
73+
q.push(f[S]);
74+
dp[f[S]] = c[f[S]];
75+
int ans = 0;
76+
while(!q.empty()) {
77+
int n = q.front(); q.pop();
78+
ans = max(ans, dp[n]);
79+
for(int i:g[n]) {
80+
dp[i] = max(dp[i], dp[n] + c[i]);
81+
if(!--deg[i]) q.push(i);
82+
}
83+
}
84+
cout<<ans;
85+
86+
}
87+
```

0 commit comments

Comments
 (0)