指针代码求调

P1253 扶苏的问题

ZVitality @ 2023-06-08 12:26:07

rt,样例2过不了,输出 0。

#include <bits/stdc++.h>
using namespace std;

#define int long long

inline int Read() {
  int x = 0 , f = 1;
  char c = getchar();
  for( ; c < '0' || c > '9' ; c = getchar() ) f ^= ( c == '-' );
  for( ; c >= '0' && c <= '9' ; c = getchar() ) x = ( x << 3 ) + ( x << 1 ) + ( c ^ 48 );
  return f ? x : -x;
}

struct SegmentTree {
private:
  struct Node {
    Node *L , *R;
    int l , r;
    int sum , mx , add , cover;
    Node( int l , int r ) :
      l(l),r(r),sum(0),mx(LLONG_MIN),
      add(0),cover(LLONG_MIN),
      L(NULL),R(NULL)
      {}
    int mid() { return l + ( r - l ) / 2 ; }
    int len() { return r - l + 1 ; }
    void PushUp() {
      sum = L->sum + R->sum;
      mx = max( L->mx , R->mx );
    }
    void PushDown() {
      if( cover != LLONG_MIN ) {
        L->add = R->add = 0;
        L->cover = R->cover = cover;
        L->sum = R->sum = 0;
        cover = LLONG_MIN;
      }
      L->add += add , R->add += add;
      L->mx += add , R->mx += add;
      L->sum += add * L->len() , R->sum += add * R->len();
      add = 0;
    }
  };
public:
  Node *root;
  void Build( int l , int r , Node *&p , int a[] ) {
    p = new Node( l , r );
    if( l == r ) {
      p->sum = p->mx = a[ l ];
      return;
    }
    Build( p->l , p->mid() , p->L , a );
    Build( p->mid() + 1 , p->r , p->R , a );
    p -> PushUp();
  }
  void Add( int x , int y , int v , Node *p ) {
    if( x <= p->l && p->r <= y ) {
      p->sum += p->len() * v;
      p->mx += v;
      p->add += v;
      return;
    }
    p->PushDown();
    if( x <= p->mid() ) Add( x , y , v , p->L );
    if( y > p->mid() ) Add( x , y , v , p->R );
    p->PushUp();
  }
  int GetSum( int x , int y , Node *p ) {
    if( x <= p->l && p->r <= y ) return p->sum;
    p->PushDown();
    int ans = 0;
    if( x <= p->mid() ) ans += GetSum( x , y , p->L );
    if( y > p->mid() ) ans += GetSum( x , y , p->R );
    return ans;
  }
  void Assign( int x , int y , int v , Node *p ) {
    if( x <= p->l && p->r <= y ) {
      p->sum = v * p->len();
      p->mx = v;
      p->add = 0;
      p->cover = v;
      return;
    }
    p->PushDown();
    if( x <= p->mid() ) Assign( x , y , v , p->L );
    if( y > p->mid() ) Assign( x , y , v , p->R );
    p->PushUp();
  }
  int GetMax( int x , int y , Node *p ) {
    if( x <= p->l && p->r <= y ) {
      return p->mx;
    }
    p->PushDown();
    int ans = LLONG_MIN;
    if( x <= p->mid() ) ans = max( ans , GetMax( x , y , p->L ) );
    if( y > p->mid() ) ans = max( ans , GetMax( x , y , p->R ) );
    return ans;
  }
} seg;

const int _ = 1e6 + 5;

int a[_];
int n , q;

signed main() {
  n = Read() , q = Read();
  for( int i = 1 ; i <= n ; i++ ) a[ i ] = Read();
  seg.Build( 1 , n , seg.root , a );
  while( q-- ) {
    int op = Read() , l = Read() , r = Read() , x;
    if( op == 1 ) x = Read() , seg.Assign( l , r , x , seg.root );
    if( op == 2 ) x = Read() , seg.Add( l , r , x , seg.root );
    if( op == 3 ) printf( "%lld\n" , seg.GetMax( l , r , seg.root ) );
  }
  return 0;
}

by ZVitality @ 2023-06-08 15:02:10

噢,不对,是输出 10。


|