88pts 求调
查看原帖
88pts 求调
558833
__Floze3__楼主2024/7/29 18:32

RT,Wa on test 12。

// Author: Floze3
// Time: 2024-07-29 16:23:04
// Problem: P1997 faebdc 的烦恼
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1997
// Memory Limit: 128 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define mp(x, y) std::make_pair(x, y)
#define eb emplace_back
#define fi first
#define se second
#define il inline
#define all(x) x.begin(), x.end()
#define file(name)                 \
  freopen(name ".in", "r", stdin); \
  freopen(name ".out", "w", stdout);

typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef std::pair<int, int> pii;
typedef std::vector<int> vi;

const int N = 1e5 + 5;
const int mod = 998244353;
const int inf = 0x3f3f3f3f;
const ll infll = 0x3f3f3f3f3f3f3f3f;

int n, q, a[N];

struct dat {
  int lc, rc, l_len, r_len, ans, len;
  
  il dat operator + (const dat &rhs) {
    dat tmp;
    tmp.lc = lc, tmp.rc = rhs.rc, tmp.ans = std::max(ans, rhs.ans), tmp.len = len + rhs.len;
    tmp.l_len = l_len, tmp.r_len = rhs.r_len;
    if (rc == rhs.lc) tmp.ans = std::max(tmp.ans, r_len + rhs.l_len);
    if (rc == rhs.lc && len == r_len) tmp.l_len = std::max(tmp.l_len, l_len + rhs.l_len);
    if (rc == rhs.lc && rhs.len == rhs.l_len) tmp.r_len = std::max(tmp.r_len, rhs.l_len + r_len);
    return tmp;
  }
};

struct node {
  int l, r;
  dat x;
  
  #define ls (p << 1)
  #define rs (p << 1 | 1)
  #define mid (t[p].l + t[p].r >> 1)
} t[N << 2];

il void build(int p, int l, int r) {
  t[p].l = l, t[p].r = r;
  if (l == r) return t[p].x = {a[l], a[l], 1, 1, 1, 1}, void();
  build(ls, l, mid), build(rs, mid + 1, r);
  return t[p].x = t[ls].x + t[rs].x, void();
}

il dat query(int p, int l, int r) {
  if (t[p].l >= l && t[p].r <= r) return t[p].x;
  if (r <= mid) return query(ls, l, r);
  if (l > mid) return query(rs, l, r);
  return query(ls, l, r) + query(rs, l, r);
}

il void solve() {
  scanf("%d%d", &n, &q);
  for (int i = 1; i <= n; ++i)
    scanf("%d", a + i);
  build(1, 1, n);
  assert(t[1].x.lc == a[1] && t[1].x.rc == a[n]);
  while (q--) {
    int l, r;
    scanf("%d%d", &l, &r);
    printf("%d\n", query(1, l, r).ans);
  }
  return ;
}

signed main() {
  int _ = 1;
  while (_--) solve();
  return 0;
}

/*
all the things you do
the words you say
will all come back to you
*/

2024/7/29 18:32
加载中...