File tree Expand file tree Collapse file tree 1 file changed +87
-0
lines changed
Expand file tree Collapse file tree 1 file changed +87
-0
lines changed Original file line number Diff line number Diff line change 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+ ```
You can’t perform that action at this time.
0 commit comments