社区讨论
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 条回复,欢迎继续交流。
正在加载回复...