16 pts 求调
查看原帖
16 pts 求调
1296826
lcfollower楼主2025/1/29 21:33

rt,找出细小或大错误请 at。

# include <bits/stdc++.h>

# define int long long
# define up(i ,x, y) for (int i = x ; i <= y; i ++)

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');}

//L : 0 ; R : 1.

const int N = 2e5 + 10;
struct SGT {int l ,r ,lmx ,rmx ,mx;} tr[N << 2];
int n ,Q ,a[N];

inline void pushup (int u){
  int mid = tr[u << 1].r ,lft = mid + 1;
  
  if (tr[u << 1].lmx == mid - tr[u << 1].l + 1) tr[u].lmx = tr[u << 1].lmx + (a[mid] != a[lft]) * tr[u << 1 | 1].lmx;
  else tr[u].lmx = tr[u << 1].lmx;
  
  if (tr[u << 1 | 1].rmx = tr[u << 1 | 1].r - mid) tr[u].rmx = tr[u << 1 | 1].rmx + (a[lft] != a[mid]) * tr[u << 1].rmx;
  else tr[u].rmx = tr[u << 1 | 1].rmx;
  
  //tr[u].mx = max (tr[u].lmx ,tr[u].rmx);
  tr[u].mx = max (tr[u << 1].mx ,max (tr[u << 1 | 1].mx ,(a[mid] != a[lft]) * (tr[u << 1].rmx + tr[u << 1 | 1].lmx)));

} inline void build (int u ,int l ,int r){
  tr[u].l = l ,tr[u].r = r;

  if (l == r) { tr[u].mx = tr[u].lmx = tr[u].rmx = 1 ; 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 x){
  int l = tr[u].l ,r = tr[u].r;
  
  if (l == r && l == x) return ;

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

  if (x <= mid) modify (u << 1, x);
  else modify (u << 1 | 1 ,x);

  pushup (u);
} signed main (){
  n = read () ,Q = read ();

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

  build (1 ,1 ,n);

  while (Q --){
    int x = read ();
    a[x] = !a[x];
    modify (1 ,x);
    writeln (tr[1].mx);
  }
  return 0;

}
2025/1/29 21:33
加载中...