线段树

    1. #include<bits/stdc++.h>
    2. #define ll long long
    3. #define dl double
    4. #define fo(i,a,b) for (int i=a;i<=b;i++)
    5. #define println(x){printf(":\n");for (int tmpi=1;tmpi<=n;tmpi++)printf("%d ",x[i]);printf("\n");}
    6. using namespace std;
    7. const int N=1e5+7;
    8. const int INF=0x3f3f3f3f;
    9. const int M=1e9+7;
    10. class poi{
    11. public:
    12. ll l,r,sum,maxx,add,lc,rc;
    13. };
    14. class seg{
    15. public:
    16. vector<poi> s;
    17. void bulid(ll x){
    18. if (s[x].lc) return;
    19. ll l=s[x].l,r=s[x].r,mid=(l+r)>>1;
    20. s.push_back((poi){l,mid,0,0,0,0,0});
    21. s[x].lc=s.size()-1;
    22. s.push_back((poi){mid+1,r,0,0,0,0,0});
    23. s[x].rc=s.size()-1;
    24. }
    25. void pushdown(ll x){
    26. bulid(x);
    27. ll lc=s[x].lc,rc=s[x].rc;
    28. s[lc].add+=s[x].add;
    29. s[lc].sum+=s[x].add*(s[lc].r-s[lc].l+1);
    30. s[rc].add+=s[x].add;
    31. s[rc].sum+=s[x].add*(s[rc].r-s[rc].l+1);
    32. updata(x);
    33. }
    34. void updata(ll x){
    35. s[x].add=0;
    36. s[x].sum=s[s[x].lc].sum+s[s[x].rc].sum;
    37. s[x].maxx=max(s[s[x].lc].maxx,s[s[x].rc].maxx);
    38. }
    39. void add(ll x,ll l,ll r,ll t){
    40. if (l<=s[x].l&&s[x].r<=r){
    41. s[x].sum+=t*(s[x].r-s[x].l+1);
    42. s[x].add+=t;
    43. s[x].maxx+=t;
    44. return;
    45. }
    46. else{
    47. pushdown(x);
    48. if (l<=s[s[x].lc].r){
    49. add(s[x].lc,l,r,t);
    50. }
    51. if (r>=s[s[x].rc].l){
    52. add(s[x].rc,l,r,t);
    53. }
    54. updata(x);
    55. }
    56. }
    57. ll query_sum(ll x,ll l,ll r){
    58. if (l<=s[x].l&&s[x].r<=r){
    59. return s[x].sum;
    60. }
    61. else{
    62. pushdown(x);
    63. ll tmp=0;
    64. if (l<=s[s[x].lc].r){
    65. tmp+=query_sum(s[x].lc,l,r);
    66. }
    67. if (r>=s[s[x].rc].l){
    68. tmp+=query_sum(s[x].rc,l,r);
    69. }
    70. return tmp;
    71. }
    72. }
    73. ll query_max(ll x,ll l,ll r){
    74. if (l<=s[x].l&&s[x].r<=r){
    75. return s[x].maxx;
    76. }
    77. else{
    78. pushdown(x);
    79. ll tmp=0;
    80. if (l<=s[s[x].lc].r){
    81. tmp=max(tmp,query_max(s[x].lc,l,r));
    82. }
    83. if (r>=s[s[x].rc].l){
    84. tmp=max(tmp,query_max(s[x].rc,l,r));
    85. }
    86. return tmp;
    87. }
    88. }
    89. }tree;
    90. int n;
    91. int m;
    92. ll l,r,t;
    93. ll a;
    94. void read(){
    95. scanf("%d",&n);
    96. tree.s.push_back((poi){1,n,0,0,0,0,0});
    97. for (int i=1;i<=n;i++){
    98. scanf("%lld",&a);
    99. tree.add(0,i,i,a);
    100. }
    101. tree.add(0,1,2,4);
    102. cout<<tree.query_max(0,1,4);
    103. /*scanf("%d",&m);
    104. char ch[5];
    105. for (int i=1;i<=m;i++){
    106. scanf("%s",ch);
    107. if (ch[0]=='S'){
    108. scanf("%lld%lld",&l,&r);
    109. printf("%lld\n",tree.sum(0,l,r));
    110. }
    111. if (ch[0]=='A'){
    112. scanf("%lld%lld%lld",&l,&r,&t);
    113. tree.add(0,l,r,t);
    114. }
    115. }*/
    116. }
    117. int main(){
    118. read();
    119. return 0;
    120. }

    快读

    
    inline int read(){
       int s=0,w=1;
       char ch=getchar();
       while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
       while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
       return s*w;
    }