社区讨论

WA on #5

CF1476FLanterns参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mk5ao4h2
此快照首次捕获于
2026/01/08 18:18
2 个月前
此快照最后确认于
2026/01/10 23:55
2 个月前
查看原帖
wrong answer Jury has the answer but participant doesn't (test case 1259)
CPP
#include<bits/stdc++.h>
// #define int long long
#define pb emplace_back
#define pii pair <int, int>
#define root 1, 1, n
#define id(x) (((x) - 1) / B + 1)
#define L(x) (B * ((x) - 1) + 1)
#define R(x) (B * (x) < n ? B * (x) : n)
#define chkmx(a, b) (a = max(a, (b)))
#define chkmn(a, b) (a = min(a, (b)))
using namespace std;
const int mod = 1e9 + 7, N = 3e5 + 5, K = 20;
void add(int &a, const long long& b){a = (1ll * a + b) % mod;};
int n, k, dp[N][K][2][2], sz[N], g[K][2][2], f[N], st[N][K], premx[N], a[N], judge[N];
int query(int l, int r){
  if (r < l) return 0;
  int log = __lg(r - l + 1);
  return max(st[l][log], st[r - (1 << log) + 1][log]);
}
int find(int p, int r){
  r --;
  int l = 0, ans = -1;
  while (l <= r){
    int mid = l + r >> 1;
    if (premx[mid] >= p) ans = mid, r = mid - 1;
    else l = mid + 1;
  }
  return ans;
}
signed main(){
  cin.tie(0)->sync_with_stdio(0);
  int _;
  cin >> _;
  while (_ --){
    cin >> n;
    memset(premx, 0, sizeof(int) * (n + 1));//f[N], st[N][K], premx[N], a[N], judge[N];
    memset(a, 0, sizeof(int) * (n + 1));
    memset(f, 0, sizeof(int) * (n + 1));
    memset(st, 0, sizeof(int) * (n + 1) * K);
    memset(judge, 0, sizeof(int) * (n + 1));
    for (int i = 1; i <= n; i ++) cin >> a[i], st[i][0] = a[i] + i;
    for (int k = 1; k < K; k ++)for (int i = 1; i + (1 << k) - 1 <= n; i ++)
      st[i][k] = max(st[i][k - 1], st[i + (1 << k - 1)][k - 1]);
    int ans = 0;
    for (int i = 1; i <= n; i ++){
      // cout << ans << ' ';
      // cout << i << ' ';
      if (ans >= i) {chkmx(ans, st[i][0]), f[i] = ans, judge[i] = i - 1; premx[i] = max(premx[i - 1], f[i]);continue;}
      int p = find(i - a[i] - 1, i);
      if (p == -1) {premx[i] = premx[i - 1];f[i] = ans;continue;}
      chkmx(ans, max(query(p + 1, i - 1), i - 1));
      judge[i] = p;
      f[i] = ans;
      premx[i] = max(premx[i - 1], f[i]);
      // cout << premx[i] << ' ';
    }
    // cout << ans << endl;
    if (ans < n){
      cout << "NO\n";
      continue;
    }
    cout << "YES\n";
    stack <char> out;
    int nw = n;
    while (nw > 0){
      // cout << nw << ' ';
      if (f[judge[nw]] >= nw) {out.push('R'); nw = judge[nw]; continue;}
      out.push('L');
      for (int i = judge[nw] + 1; i < nw; i ++) out.push('R');
      nw = judge[nw];
    }
    while (!out.empty()) cout << out.top(), out.pop();
    cout << '\n';
  }
	return 0;
}

回复

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

正在加载回复...