比赛 CSP2023-J模拟赛 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 排列变换 最终得分 100
用户昵称 在大街上倒立游泳 运行时间 1.274 s
代码语言 C++ 内存使用 10.50 MiB
提交时间 2023-10-18 20:50:15
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. long long n,p[1000006],f[1000006],yi,da=0;//f(i)移动i-1位可成好数数量 差分 树状数组
  4. void add(long long x,long long v){
  5. while(x<=n+1){
  6. f[x]+=v;
  7. x+=x&(-x);
  8. }
  9. }
  10. long long qian(long long x){
  11. long long ans=0;
  12. while(x){
  13. ans+=f[x];
  14. x-=x&(-x);
  15. }
  16. return ans;
  17. }
  18. int main(){
  19. freopen("permutrans.in","r",stdin);
  20. freopen("permutrans.out","w",stdout);
  21. scanf("%lld",&n);
  22. for(long long i=1;i<=n;i++) scanf("%lld",&p[i]);
  23. for(long long i=1;i<=n;i++){
  24. if(p[i]>=i){
  25. add(1,1);
  26. add(min(n,p[i])-i+2,-1);
  27. add(n-i+2,1);
  28. add(n+1,-1);
  29. }
  30. else{
  31. add(n-i+2,1);
  32. long long fz=1;
  33. add(n-i+max(fz,p[i])+2,-1);
  34. }
  35. }
  36. for(long long i=0;i<n;i++){
  37. if(qian(i+1)>da){
  38. da=qian(i+1);
  39. yi=i;
  40. }
  41. }
  42. printf("%lld %lld",da,yi);
  43. return 0;
  44. }
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.