fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int MAXN = 8005;
  5. int n, P[MAXN], s[MAXN][4];
  6.  
  7. int main() {
  8. ios::sync_with_stdio(false);
  9. cin.tie(nullptr);
  10.  
  11. cin >> n;
  12. for(int i=1;i<=n;i++){
  13. cin >> P[i];
  14. s[i][0] = min(n-i, n-P[i]);
  15. s[i][1] = min(i-1, n-P[i]);
  16. s[i][2] = min(n-i, P[i]-1);
  17. s[i][3] = min(i-1, P[i]-1);
  18. }
  19.  
  20. int k = 0;
  21. while(true){
  22. vector<array<int,3>> sq;
  23. for(int i=1;i<=n;i++)
  24. for(int j=0;j<4;j++)
  25. if(s[i][j]!=-1)
  26. sq.push_back({-s[i][j], i, j}), s[i][j]=-1;
  27.  
  28. if(sq.empty()) break;
  29.  
  30. sort(sq.begin(), sq.end());
  31. int S = 600; // 후보 상한
  32. if((int)sq.size()>S) sq.erase(sq.begin()+S, sq.end());
  33.  
  34. for(auto [d,i,j]: sq){
  35. d = -d;
  36. int x1, x2, y1, y2;
  37. if(j&1) x1 = i-d, x2 = i-1;
  38. else x1 = i+1, x2 = i+d;
  39. if(j&2) y1 = P[i]-d, y2 = P[i]-1;
  40. else y1 = P[i]+1, y2 = P[i]+d;
  41. for(int t = max(1,x1); t <= min(n,x2); t++){
  42. if(P[t]<y1 || P[t]>y2) continue;
  43. s[t][0] = max(s[t][0], min(x2-t, y2-P[t]));
  44. s[t][1] = max(s[t][1], min(t-x1, y2-P[t]));
  45. s[t][2] = max(s[t][2], min(x2-t, P[t]-y1));
  46. s[t][3] = max(s[t][3], min(t-x1, P[t]-y1));
  47. }
  48. }
  49. k++;
  50. }
  51.  
  52. cout << n-k << '\n';
  53. }
Success #stdin #stdout 0.01s 5312KB
stdin
4
4 1 3 2
stdout
0