社区讨论

样例未过求条

P2572[SCOI2010] 序列操作参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mhjadpt9
此快照首次捕获于
2025/11/03 23:20
4 个月前
此快照最后确认于
2025/11/03 23:20
4 个月前
查看原帖
rt,样例最后一个点少一
CPP
#include<bits/stdc++.h>

#define lp p<<1

#define rp p<<1|1

#define int long long

using namespace std;

const int N = 1e5 + 10, MOD = 1e9 + 7, inf = 1e9;

struct node{
  int len, s0, s1, lm0, rm0, m0, lm1, rm1, m1;
}tr[N * 4], e;

int n, m, a[N], tag[N * 4], tag2[N * 4];

node comb(node a, node b){
  node c = a;
  c.len += b.len, c.s0 += b.s0, c.s1 += b.s1;
  c.m0 = max({b.m0, a.m0, a.rm0 + b.lm0});
  c.rm0 = b.rm0;
  if(a.s1 == 0){
    c.lm0 = max(c.lm0, a.s0 + b.lm0);
  }
  if(b.s1 == 0){
    c.rm0 = max(c.rm0, b.s0 + a.rm0);
  }
  c.m1 = max({b.m1, a.m1, a.rm1 + b.lm1});
  c.rm1 = b.rm1;
  if(a.s0 == 0){
    c.lm1 = max(c.lm1, a.s1 + b.lm1);
  }
  if(b.s0 == 0){
    c.rm1 = max(c.rm1, b.s1 + a.rm1);
  }
  return c;
}

 void change(int p, int x){
  if(x == 0){
    tr[p].s0 = tr[p].m0 = tr[p].lm0 = tr[p].rm0 = tr[p].len;
    tr[p].s1 = tr[p].m1 = tr[p].lm1 = tr[p].rm1 = 0;
  }else{
    tr[p].s0 = tr[p].m0 = tr[p].lm0 = tr[p].rm0 = 0;
    tr[p].s1 = tr[p].m1 = tr[p].lm1 = tr[p].rm1 = tr[p].len;
  }
}

void build(int l, int r, int p){
  tag[p] = -1;
  if(l == r){
    tr[p].len = 1;
    change(p, a[l]);
    return ;
  }
  int mid = (l + r) >> 1;
  build(l, mid, lp), build(mid + 1, r, rp);
  tr[p] = comb(tr[lp], tr[rp]);
}

void pushdown(int p){
  if(tag[p] != -1){
    tag2[p] = tag2[lp] = tag2[rp] = 0;
    change(lp, tag[p]), change(rp, tag[p]);
    tag[lp] = tag[rp] = tag[p], tag[p] = -1;
  }
  if(tag2[p]){
    (tag[lp] != -1 ? tag[lp] ^= 1 : tag2[lp] ^= 1);
    (tag[rp] != -1 ? tag[rp] ^= 1 : tag2[rp] ^= 1);
    swap(tr[lp].s0, tr[lp].s1), swap(tr[lp].m0, tr[lp].m1);
    swap(tr[rp].s0, tr[rp].s1), swap(tr[rp].m0, tr[rp].m1);
    swap(tr[lp].lm0, tr[lp].lm1), swap(tr[lp].rm0, tr[lp].rm1);
    swap(tr[rp].lm0, tr[rp].lm1), swap(tr[rp].rm0, tr[rp].rm1);
    tag[p] = 0;
  }
}

void update1(int l, int r, int p, int s, int t, int x){
  pushdown(p);
  if(s <= l && r <= t){
    change(p, x);
    tag[p] = x;
    return ;
  }
  int mid = (l + r) >> 1;
  if(s <= mid){
    update1(l, mid, lp, s, t, x);
  }
  if(t > mid){
    update1(mid + 1, r, rp, s, t, x);
  }
  tr[p] = comb(tr[lp], tr[rp]);
}

void update2(int l, int r, int p, int s, int t){
  pushdown(p);
  if(s <= l && r <= t){
    swap(tr[p].s0, tr[p].s1), swap(tr[p].m0, tr[p].m1);
    swap(tr[p].lm0, tr[p].lm1), swap(tr[p].rm0, tr[p].rm1);
    tag2[p] ^= 1;
    return ;
  }
  int mid = (l + r) >> 1;
  if(s <= mid){
    update2(l, mid, lp, s, t);
  }
  if(t > mid){
    update2(mid + 1, r, rp, s, t);
  }
  tr[p] = comb(tr[lp], tr[rp]);
}

node query(int l, int r, int p, int s, int t){
  pushdown(p);
  if(s <= l && r <= t){
    return tr[p];
  }
  if(l > t || r < s){
    return e;
  }
  int mid = (l + r) >> 1;
  return comb(query(l, mid, lp, s, t), query(mid + 1, r, rp, s, t));
}

signed main(){
  //ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  for(int i = 1; i <= n; i++){
    cin >> a[i];
  }
  build(1, n, 1);
  for(int op, l, r; m--; ){
    cin >> op >> l >> r;
    l++, r++;
    if(op <= 1){
      update1(1, n, 1, l, r, op);
    }else if(op == 2){
      update2(1, n, 1, l, r);
    }else{
      node t = query(1, n, 1, l, r);
      if(op == 3){
        cout << t.s1 << '\n';
      }else{
        cout << t.m1 << '\n';
      }
    }
  }
  return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...