当前位置:   article > 正文

场景四:参考代码C++_位运算区间翻转c++

位运算区间翻转c++
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int INF=0x3f3f3f3f,N=1e5+10;;
  5. int rootx[N*20],ch[N*20][2],totx,toty,Lim,A[N],sum[N],rev[N];
  6. struct node {
  7. int Lrt,Rrt,Max;
  8. }NODE[N*20*20];
  9. void Update_y(int& y, int l, int r, int pos, int val) {
  10. if (!y) {
  11. y=++toty;
  12. NODE[y].Max=-1;
  13. }
  14. NODE[y].Max=max(NODE[y].Max,val);
  15. if (l==r) return;
  16. int m=(l+r)>>1;
  17. if (pos<=m) Update_y(NODE[y].Lrt,l,m,pos,val);
  18. else Update_y(NODE[y].Rrt,m+1,r,pos,val);
  19. }
  20. void Update_x(int&x, int y, int l, int r, int pos, int val) {
  21. if (!x) x=++totx;
  22. Update_y(rootx[x],1,Lim,y,val);
  23. if (l==r) return;
  24. int m=(l+r)>>1;
  25. if (pos<=m) Update_x(ch[x][0],y,l,m,pos,val);
  26. else Update_x(ch[x][1],y,m+1,r,pos,val);
  27. }
  28. int query_y(int rt, int L, int R, int l, int r) {
  29. if (rt==0) return -INF;
  30. if (L==l&&R==r) return NODE[rt].Max;
  31. int m=(l+r)>>1;
  32. if (R<=m) return query_y(NODE[rt].Lrt,L,R,l,m);
  33. else if (L>m) return query_y(NODE[rt].Rrt,L,R,m+1,r);
  34. else return max(query_y(NODE[rt].Lrt,L,m,l,m),query_y(NODE[rt].Rrt,m+1,R,m+1,r));
  35. }
  36. int query_x(int rt, int ly, int ry, int lx, int rx, int l, int r) {
  37. if (rt==0) return -INF;
  38. if (lx==l&&r==rx) return query_y(rootx[rt],ly,ry,1,Lim);
  39. int m=(l+r)>>1;
  40. if (rx<=m) return query_x(ch[rt][0],ly,ry,lx,rx,l,m);
  41. else if (lx>m) return query_x(ch[rt][1],ly,ry,lx,rx,m+1,r);
  42. else return max(query_x(ch[rt][0],ly,ry,lx,m,l,m),query_x(ch[rt][1],ly,ry,m+1,rx,m+1,r));
  43. }
  44. int main() {
  45. int n; scanf("%d",&n);
  46. for (int i=1; i<=n; i++) {
  47. scanf("%d",&A[i]); Lim=max(Lim,A[i]);
  48. }
  49. Lim++;
  50. A[0]=Lim; //设置比最大值大
  51. A[n+1]=-1; //设置比最小值小
  52. for (int i=2; i<=n; i++) {
  53. sum[i]=sum[i-1];
  54. if (A[i]>A[i-1]) sum[i]++;
  55. }
  56. sum[n+1]=sum[n];
  57. for (int i=n-1; i>=1; i--) {
  58. rev[i]=rev[i+1];
  59. if (A[i]>A[i+1]) rev[i]++;
  60. }
  61. int rt=0,ans=0;
  62. for (int R=1; R<=n; R++) {
  63. Update_x(rt,A[R],1,Lim,A[R-1],sum[R-1]+rev[R]);
  64. int X=sum[n]-sum[R+1]-rev[R];
  65. //情况一:
  66. int lx=1,rx=A[R]-1;
  67. int ly=1,ry=A[R+1]-1;
  68. if (lx<=rx&&ly<=ry) ans=max(ans,X+query_x(rt,ly,ry,lx,rx,1,Lim)+2);
  69. //情况二:
  70. lx=1,rx=A[R]-1;
  71. ly=max(A[R+1],1),ry=Lim;
  72. if (lx<=rx&&ly<=ry) ans=max(ans,X+query_x(rt,ly,ry,lx,rx,1,Lim)+1);
  73. //情况三:
  74. lx=A[R],rx=Lim;
  75. ly=1,ry=A[R+1]-1;
  76. if (lx<=rx&&ly<=ry) ans=max(ans,X+query_x(rt,ly,ry,lx,rx,1,Lim)+1);
  77. //情况四:
  78. lx=A[R],rx=Lim;
  79. ly=max(A[R+1],1),ry=Lim;
  80. if (lx<=rx&&ly<=ry) ans=max(ans,X+query_x(rt,ly,ry,lx,rx,1,Lim));
  81. }
  82. printf("%d\n",ans);
  83. return 0;
  84. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/209601?site
推荐阅读
相关标签
  

闽ICP备14008679号