【悬关】线段树不过样例 & HACK 0 pts 求调
查看原帖
【悬关】线段树不过样例 & HACK 0 pts 求调
1296826
lcfollower楼主2025/2/4 22:40

rt。。。

原本过了 HACK & 样例但是调后全 WA 了。

# include <bits/stdc++.h>

# define int long long
# define up(i ,x ,y) for (int i = x ; i <= y ; i ++)
# define dn(i ,x ,y) for (int i = x ; i >= y ; i --)
# define lowbit (x) x & -x

using namespace std;

inline int read (){int s = 0 ; bool w = 0 ; char c = getchar () ; while (!isdigit (c)) {w |= (c == '-') ,c = getchar () ;} while (isdigit (c)){s = (s << 1) + (s << 3) + (c ^ 48) ; c = getchar ();}return w ? -s : s;}
inline void write (int x){if (x < 0) putchar ('-') ,x = -x; if (x > 9) write (x / 10) ; putchar (x % 10 | 48);}
inline void writesp (int x){write (x) ,putchar (' ');}
inline void writeln (int x){write (x) ,putchar ('\n');}

const int N = 5e5 + 5;
int n ,Q ,a[N];

struct SGT {
  int l ,r ,sum1 ,cov ,lmx[2] ,rmx[2] ,mx[2];
  bool rev;
} tr[N << 2];

inline void pushup (int u){
  tr[u].sum1 = tr[u << 1].sum1 + tr[u << 1 | 1].sum1;
  
  up (i ,0 ,1){
    SGT lft = tr[u << 1] ,rgt = tr[u << 1 | 1];

    tr[u].lmx[i] = lft.lmx[i];

    if (i == 1 && lft.sum1 == lft.r - lft.l + 1) tr[u].lmx[i] += rgt.lmx[i];
    else if (i == 0 && lft.sum1 == 0) tr[u].lmx[i] += rgt.lmx[i];

    tr[u].rmx[i] = rgt.rmx[i];

    if (i == 1 && rgt.sum1 == rgt.r - rgt.l + 1) tr[u].rmx[i] += rgt.rmx[i];
    else if (i == 0 && rgt.sum1 == 0) tr[u].rmx[i] += rgt.rmx[i];

    tr[u].mx[i] = max (lft.mx[i] ,max (rgt.mx[i] ,lft.rmx[i] + rgt.lmx[i]));
  
  }

} inline void pushdown (int u){
  if (tr[u].cov != -1){
    tr[u].rev = 0;

    tr[u << 1].sum1 = (tr[u << 1].r - tr[u << 1].l + 1) * tr[u].cov ,
    tr[u << 1 | 1].sum1 = (tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1) * tr[u].cov;

    tr[u << 1].lmx[tr[u].cov] = tr[u << 1].rmx[tr[u].cov] = tr[u << 1].mx[tr[u].cov] = tr[u << 1].r - tr[u << 1].l + 1;
    tr[u << 1].lmx[tr[u].cov ^ 1] = tr[u << 1].rmx[tr[u].cov ^ 1] = tr[u << 1].mx[tr[u].cov ^ 1] = 0;
    tr[u << 1].rev = 0;

    tr[u << 1 | 1].lmx[tr[u].cov] = tr[u << 1 | 1].rmx[tr[u].cov] = tr[u << 1 | 1].mx[tr[u].cov] = tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1;
    tr[u << 1 | 1].lmx[tr[u].cov ^ 1] = tr[u << 1 | 1].rmx[tr[u].cov ^ 1] = tr[u << 1 | 1].mx[tr[u].cov ^ 1] = 0;
    tr[u << 1 | 1].rev = 0;
    
    tr[u].cov = -1;

  } if (tr[u].rev){
    tr[u << 1].sum1 = (tr[u << 1].r - tr[u << 1].l + 1) - tr[u << 1].sum1 ,
    tr[u << 1 | 1].sum1 = (tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1) - tr[u << 1 | 1].sum1;

    if (tr[u << 1].cov != -1) tr[u << 1].cov ^= 1 ;
    else tr[u << 1].rev ^= 1;

    if (tr[u << 1 | 1].cov != -1) tr[u << 1 | 1].cov ^= 1;
    else tr[u << 1 | 1].rev ^= 1;

    swap (tr[u << 1].lmx[0] ,tr[u << 1].lmx[1]);
    swap (tr[u << 1].rmx[0] ,tr[u << 1].rmx[1]);
    swap (tr[u << 1].mx[0] ,tr[u << 1].mx[1]);

    swap (tr[u << 1 | 1].lmx[0] ,tr[u << 1 | 1].lmx[1]);
    swap (tr[u << 1 | 1].rmx[0] ,tr[u << 1 | 1].rmx[1]);
    swap (tr[u << 1 | 1].mx[0] ,tr[u << 1 | 1].mx[1]);

    tr[u].rev = 0;
  }
} inline void build (int u ,int l ,int r){
  tr[u].l = l ,tr[u].r = r ,tr[u].cov = -1;

  if (l == r){
    tr[u].lmx[a[l]] = tr[u].rmx[a[l]] = tr[u].mx[a[l]] = 1;
    tr[u].sum1 = a[l];
    return ;
  }

  int mid = ((l + r) >> 1);

  build (u << 1 ,l ,mid);
  build (u << 1 | 1 ,mid + 1 ,r);

  pushup (u);

} inline void modify (int u ,int ql ,int qr ,bool v){

  int l = tr[u].l ,r = tr[u].r;

  if (l >= ql && r <= qr){
    tr[u].cov = v;
    tr[u].sum1 = (tr[u].r - tr[u].l + 1) * v;
    tr[u].lmx[v] = tr[u].rmx[v] = tr[u].mx[v] = (tr[u].r - tr[u].l + 1);
    tr[u].lmx[v ^ 1] = tr[u].rmx[v ^ 1] = tr[u].mx[v ^ 1] = 0;

    tr[u].rev = 0;

    return ;
  }

  pushdown (u);
  
  int mid = ((l + r) >> 1);

  if (ql <= mid) modify (u << 1 ,ql ,qr ,v);
  if (mid < qr) modify (u << 1 | 1 ,ql ,qr ,v);

  pushup (u);

} inline void reverse (int u ,int ql ,int qr){

  int l = tr[u].l ,r = tr[u].r;

  if (l >= ql && r <= qr){
    tr[u].rev ^= 1;
    tr[u].sum1 = (tr[u].r - tr[u].l + 1) - tr[u].sum1;

    swap (tr[u].lmx[0] ,tr[u].lmx[1]);
    swap (tr[u].rmx[0] ,tr[u].rmx[1]);
    swap (tr[u].mx[0] ,tr[u].mx[1]);
  
    return ;
  }
 
  pushdown (u);
  
  int mid = ((l + r) >> 1);

  if (ql <= mid) reverse (u << 1 ,ql ,qr);
  if (mid < qr) reverse (u << 1 | 1 ,ql ,qr);

  pushup (u);

} inline int query1 (int u ,int ql ,int qr){
  int l = tr[u].l ,r = tr[u].r;

  if (l >= ql && r <= qr) return tr[u].sum1;

  pushdown (u);

  int mid = ((l + r) >> 1) ,res = 0;

  if (ql <= mid) res += query1 (u << 1 ,ql ,qr);
  if (mid < qr) res += query1 (u << 1 | 1 ,ql ,qr);

  return res;

} inline SGT queryc1 (int u ,int ql ,int qr){
  int l = tr[u].l ,r = tr[u].r;

  if (l >= ql && r <= qr) return tr[u];

  pushdown (u);

  int mid = ((l + r) >> 1);

  if (qr <= mid) return queryc1 (u << 1 ,ql ,qr);
  if (ql > mid) return queryc1 (u << 1 | 1 ,ql ,qr);

  SGT lft = queryc1 (u << 1 ,ql ,qr) ,rgt = queryc1 (u << 1 | 1 ,ql ,qr) ,res;

  up (i ,0 ,1){
    
    res.lmx[i] = lft.lmx[i];

    if (i == 1 && lft.sum1 == lft.r - lft.l + 1) res.lmx[i] += rgt.lmx[i];
    else if (i == 0 && lft.sum1 == 0) res.lmx[i] += rgt.lmx[i];

    res.rmx[i] = rgt.rmx[i];

    if (i == 1 && rgt.sum1 == rgt.r - rgt.l + 1) res.rmx[i] += rgt.rmx[i];
    else if (i == 0 && rgt.sum1 == 0) res.rmx[i] += rgt.rmx[i];

    res.mx[i] = max (max (lft.mx[i] ,rgt.mx[i]) ,lft.rmx[i] + rgt.lmx[i]);

  }

  return res;

} signed main (){

  n = read () ,Q = read ();

  up (i ,1 ,n) a[i] = read ();

  build (1 ,1 ,n);

  while (Q --){
    int op = read () ,l = read () + 1 ,r = read () + 1;

    if (op <= 1){
      modify (1 ,l ,r ,op);
    } else if (op == 2){
      reverse (1 ,l ,r);
    } else if (op == 3){
      writeln (query1 (1 ,l ,r));
    } else if (op == 4){
      writeln (queryc1 (1 ,l ,r).mx[1]);
    }
  }
  return 0;

}
2025/2/4 22:40
加载中...