Advertisement
yuhung94

Spies

Nov 21st, 2022
554
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.67 KB | None | 0 0
  1. #pragma GCC optimzize("Ofast,no-stack-protector")
  2. #include<bits/stdc++.h>
  3. //#define int long long
  4. #define quick ios::sync_with_stdio(0);cin.tie(0);
  5. #define rep(x,a,b) for(int x=a;x<=b;x++)
  6. #define repd(x,a,b) for(int x=a;x>=b;x--)
  7. #define lowbit(x) (x&-x)
  8. #define sz(x) (int)(x.size())
  9. #define F first
  10. #define S second
  11. #define all(x) x.begin(),x.end()
  12. #define mp make_pair
  13. #define eb emplace_back
  14. using namespace std;
  15. typedef pair<int,int> pii;
  16. void debug(){
  17.     cout<<"\n";
  18. }
  19. template <class T,class ... U >
  20. void debug(T a, U ... b){
  21.     cout<<a<<" ",debug(b...);
  22. }
  23. const int N=1e6+7;
  24. const int INF=1e8;
  25. vector<int> v[N];
  26. int dp[N][2];
  27. int dp2[N][2];
  28. int s[N];
  29. bool vis[N];
  30. bool cycle[N];
  31. bool deg[N];
  32. vector<vector<int> > c;
  33. void findcycle(int x){
  34.     int t=s[x];
  35.     vis[x]=true;
  36.     while(x!=t){
  37.         x=s[x];
  38.         t=s[s[t]];
  39.         vis[x]=vis[t]=true;
  40.     }
  41.     t=s[t];
  42.     if(cycle[x]) return ;
  43.     cycle[x]=true;
  44.     vis[x]=true;
  45.     c.eb();
  46.     c.back().eb(x);
  47.     while(t!=x){
  48.         cycle[t]=true;
  49.         vis[t]=true;
  50.         c.back().eb(t);
  51.         t=s[t];
  52.     }
  53. }
  54. void dfs(int x){
  55.     dp[x][0]=0;
  56.     dp[x][1]=1;
  57.     int cost=INF;
  58.     for(int i:v[x]){
  59.         dfs(i);
  60.         dp[x][0]+=max(dp[i][1],dp[i][0]);
  61.         dp[x][1]+=max(dp[i][1],dp[i][0]);
  62.         cost=min(cost,max(dp[i][1]-dp[i][0],0));
  63.     }
  64.     dp[x][1]-=cost;
  65. }
  66. int solve(vector<int>&k){
  67.     if(sz(k)==1){
  68.         return max(dp[k.back()][0],dp[k.back()][1]);
  69.     }
  70.     /*else if(sz(k)==2){
  71.         return max({dp[k[0]][0]+dp[k[1]][0]+1,dp[k[1]][1]+dp[k[2]][1]});
  72.     }*/
  73.     int l=sz(k);
  74.     dp2[0][0]=dp[k[0]][0];
  75.     dp2[0][1]=dp[k[0]][0]+1;// last not choose
  76.     rep(i,1,l-1){
  77.         int now=k[i];
  78.         dp2[i][0]=max(dp2[i-1][0],dp2[i-1][1])+dp[now][0];
  79.         dp2[i][1]=max(dp2[i-1][0]+max(dp[now][0]+1,dp[now][1]),dp2[i-1][1]+dp[now][1]);
  80.     }
  81.     //last choose:
  82.     int ans=dp2[l-1][0];
  83.     //debug("ans1",dp2[l-1][0]);
  84.     dp2[0][0]=dp[k[0]][0];
  85.     dp2[0][1]=dp[k[0]][1];
  86.     rep(i,1,l-1){
  87.         int now=k[i];
  88.         dp2[i][0]=max(dp2[i-1][0],dp2[i-1][1])+dp[now][0];
  89.         dp2[i][1]=max(dp2[i-1][0]+max(dp[now][1],dp[now][0]+1),dp2[i-1][1]+dp[now][1]);
  90.     }
  91.     ans=max(ans,dp2[l-1][1]);
  92.     //debug("ans2",dp2[l-1][1]);
  93.     return ans;
  94. }
  95. signed main(){
  96.     quick
  97.     int n;
  98.     cin>>n;
  99.     rep(i,1,n){
  100.         cin>>s[i];
  101.         deg[s[i]]=true;
  102.     }
  103.     rep(i,1,n){
  104.         if(!deg[i]&&!vis[i]){
  105.             //debug("f",i);
  106.             findcycle(i);
  107.         }
  108.     }
  109.     rep(i,1,n){
  110.         if(!vis[i]){
  111.             //debug("f2",i);
  112.             findcycle(i);
  113.         }
  114.     }
  115.     rep(i,1,n){
  116.         if(!cycle[i]||!cycle[s[i]]) {
  117.             v[s[i]].eb(i);
  118.         }
  119.     }
  120.     int ans=0;
  121.     rep(i,1,n){
  122.         if(cycle[i]){
  123.             dfs(i);
  124.             assert(dp[i][0]+1>=dp[i][1]);
  125.     //      debug(i,dp[i][0],dp[i][1]);
  126.         }
  127.     }
  128.     for(vector<int>&v2:c){
  129.     //  debug("v2");for(int i:v2) cout<<i<<" ";cout<<"\n";
  130.         int slv=solve(v2);
  131.         ans+=slv;
  132.     }
  133.     cout<<ans<<"\n";
  134.     return 0;
  135. }
  136.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement