Advertisement
yuhung94

Spies

Nov 21st, 2022 (edited)
596
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.22 KB | None | 0 0
  1. #pragma GCC optimzize("O1")
  2. #include<iostream>
  3. #include<vector>
  4. #include<queue>
  5. //#define int long long
  6. #define quick ios::sync_with_stdio(0);cin.tie(0);
  7. #define rep(x,a,b) for(int x=a;x<=b;x++)
  8. #define repd(x,a,b) for(int x=a;x>=b;x--)
  9. #define lowbit(x) (x&-x)
  10. #define sz(x) (int)(x.size())
  11. #define F first
  12. #define S second
  13. #define all(x) x.begin(),x.end()
  14. #define mp make_pair
  15. #define eb emplace_back
  16. using namespace std;
  17. const int N=1e6+1;
  18. const int INF=1e8;
  19. int dp[N][2];
  20. int cost[N];
  21. int s[N];
  22. bool vis[N];
  23. int solve(int x){
  24.     vector<int> k;
  25.     k.eb(x);
  26.     vis[x]=true;
  27.     for(int i=s[x];i!=x;i=s[i]){
  28.         vis[i]=true;
  29.         k.eb(i);
  30.     }
  31.     if(sz(k)==1){
  32.         return max(dp[k.back()][0],dp[k.back()][1]);
  33.     }
  34.     /*else if(sz(k)==2){
  35.         return max({dp[k[0]][0]+dp[k[1]][0]+1,dp[k[1]][1]+dp[k[2]][1]});
  36.     }*/
  37.     int l=sz(k);
  38.     vector<vector<int> > dp2(l,vector<int>(2));
  39.     dp2[0][0]=dp[k[0]][0];
  40.     dp2[0][1]=dp[k[0]][0]+1;// last not choose
  41.     rep(i,1,l-1){
  42.         int now=k[i];
  43.         dp2[i][0]=max(dp2[i-1][0],dp2[i-1][1])+dp[now][0];
  44.         dp2[i][1]=max(dp2[i-1][0]+max(dp[now][0]+1,dp[now][1]),dp2[i-1][1]+dp[now][1]);
  45.     }
  46.     //last choose:
  47.     int ans=dp2[l-1][0];
  48.     //debug("ans1",dp2[l-1][0]);
  49.     dp2[0][0]=dp[k[0]][0];
  50.     dp2[0][1]=dp[k[0]][1];
  51.     rep(i,1,l-1){
  52.         int now=k[i];
  53.         dp2[i][0]=max(dp2[i-1][0],dp2[i-1][1])+dp[now][0];
  54.         dp2[i][1]=max(dp2[i-1][0]+max(dp[now][1],dp[now][0]+1),dp2[i-1][1]+dp[now][1]);
  55.     }
  56.     ans=max(ans,dp2[l-1][1]);
  57.     //debug("ans2",dp2[l-1][1]);
  58.     return ans;
  59. }
  60. signed main(){
  61.     quick
  62.     int n;
  63.     cin>>n;
  64.     vector<int> deg(n+1);
  65.     rep(i,1,n){
  66.         cin>>s[i];
  67.         deg[s[i]]++;
  68.     }
  69.     rep(i,1,n){
  70.         cost[i]=INF;
  71.     }
  72.     int ans=0;
  73.     queue<int> q;
  74.     rep(i,1,n){
  75.         dp[i][0]=0;
  76.         dp[i][1]=1;
  77.         if(!deg[i]){
  78.             q.push(i);
  79.             dp[i][1]=-INF;
  80.             cost[i]=0;
  81.             vis[i]=true;
  82.         }
  83.     }
  84.     while(q.size()){
  85.         int x=q.front();
  86.         q.pop();
  87.         int i=s[x];
  88.         dp[i][1]+=max(dp[x][0],dp[x][1]);
  89.         dp[i][0]+=max(dp[x][0],dp[x][1]);
  90.         cost[i]=min(cost[i],max(dp[x][1]-dp[x][0],0));
  91.         deg[i]--;
  92.         if(!deg[i]){
  93.             dp[i][1]-=cost[i];
  94.             cost[i]=0;
  95.             vis[i]=true;
  96.             q.push(i);
  97.         }  
  98.     }
  99.     rep(i,1,n) dp[i][1]-=cost[i];
  100.     deg.clear();
  101.     deg.shrink_to_fit();
  102.     rep(i,1,n){
  103.         if(vis[i]) continue;
  104.         ans+=solve(i);
  105.     }
  106.     cout<<ans<<"\n";
  107.     return 0;
  108. }
  109.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement