QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#867725 | #9684. 倾诉 | Tony2 | 0 | 0ms | 0kb | C++20 | 10.8kb | 2025-01-23 22:16:05 | 2025-01-23 22:16:05 |
Judging History
answer
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
using ull = unsigned long long;
const int N = 2e4 + 35, lim = 22, mod1 = 998244353, mod2 = 1e9 + 7, inf = 1e9 + 2;
mt19937 rnd(0);
int tt, n, K, a[N], cur[N], prehigh[N], suf1[N];
int log2n, st[N][25];
int pre2[N], sum2[N];
ull sum[N][lim + 5];
int pw1[N * 2], pw2[N * 2], inv1[N * 2], inv2[N * 2];
int rt[N];
struct Msg{
int len, a1, a2;
Msg(){}
Msg(int len, int a1, int a2) : len(len), a1(a1), a2(a2) {}
friend Msg operator + (const Msg &a, const Msg &b){
return Msg(a.len + b.len, (a.a1 + 1ll * b.a1 * pw1[a.len]) % mod1, (a.a2 + 1ll * b.a2 * pw2[a.len]) % mod2);
}
}all1[N];
bool same(const Msg &a, const Msg &b){
return a.len == b.len && a.a1 == b.a1 && a.a2 == b.a2;
}
struct Str{
int k, highbit, lowbit, b[N];
int hs1[N], hs2[N];
void init(int l, int r, int _k){
for (int i = 1; i <= n + lim; i++) b[i] = 0;
for (int i = l; i <= r; i++)
for (int j = 0; j < lim; j++)
if ((a[i] >> j) & 1)
b[i + j]++;
int c = 0;
for (int i = 1; i <= n + lim; i++){
c += b[i];
b[i] = c % 2;
c /= 2;
if (b[i]) highbit = i;
}
for (int i = n + lim; i >= 1; i--)
if (b[i])
lowbit = i;
for (int i = 1; i <= n + lim; i++){
hs1[i] = (hs1[i - 1] + 1ll * b[i] * pw1[i]) % mod1;
hs2[i] = (hs2[i - 1] + 1ll * b[i] * pw2[i]) % mod2;
}
}
Msg ask(int l, int r) const{
int l2 = max(1, l), r2 = min(n + lim, r);
int x1 = (hs1[r2] - hs1[l2 - 1] + mod1) % mod1, x2 = (hs2[r2] - hs2[l2 - 1] + mod2) % mod2;
if (l >= 0) return Msg(r - l + 1, 1ll * x1 * inv1[l] % mod1, 1ll * x2 * inv2[l] % mod2);
else return Msg(r - l + 1, 1ll * x1 * pw1[-l] % mod1, 1ll * x2 * pw2[-l] % mod2);
}
int ask(int x) const{
if (1 <= x && x <= n + lim) return b[x];
else return 0;
}
};
struct tree{
#define mid ((l + r) >> 1)
int tot;
struct node{
int ls, rs;
Msg msg;
}a[N * 22 * 22];
void build(int &p, int l, int r){
p = ++tot;
if (l == r){
a[p].msg = Msg(1, 0, 0);
return;
}
build(a[p].ls, l, mid);
build(a[p].rs, mid + 1, r);
a[p].msg = a[a[p].ls].msg + a[a[p].rs].msg;
}
void add(int &p, int o, int l, int r, int s, int k){
a[p = ++tot] = a[o];
if (l == r){
a[p].msg = Msg(1, k, k);
return;
}
if (s <= mid) add(a[p].ls, a[o].ls, l, mid, s, k);
else add(a[p].rs, a[o].rs, mid + 1, r, s, k);
a[p].msg = a[a[p].ls].msg + a[a[p].rs].msg;
}
Msg ask(int p, int l, int r, int s, int t){
if (s <= l && r <= t) return a[p].msg;
Msg res(0, 0, 0);
if (s <= mid) res = res + ask(a[p].ls, l, mid, s, t);
if (t > mid) res = res + ask(a[p].rs, mid + 1, r, s, t);
return res;
}
Msg ask(int p, int l, int r, int s){
return ask(p, l, r, s, s);
}
int askr(int p, int l, int r, int s){
if (a[p].msg.a1 == 0 && a[p].msg.a2 == 0) return 0;
if (s <= l){
if (l == r) return l;
int res = askr(a[p].ls, l, mid, s);
if (res) return res;
else return askr(a[p].rs, mid + 1, r, s);
}
if (s <= mid){
int res = askr(a[p].ls, l, mid, s);
if (res) return res;
else return askr(a[p].rs, mid + 1, r, s);
}else return askr(a[p].rs, mid + 1, r, s);
}
int ask2(int p, int l, int r, int s, int t, const Str &str){
if (r <= s){
if (same(a[p].msg, str.ask(t - (s - l), t - (s - r)))) return l - 1;
if (l == r) return l;
int res = ask2(a[p].rs, mid + 1, r, s, t, str);
if (res > mid) return res;
else return ask2(a[p].ls, l, mid, s, t, str);
}
if (mid < s){
int res = ask2(a[p].rs, mid + 1, r, s, t, str);
if (res > mid) return res;
else return ask2(a[p].ls, l, mid, s, t, str);
}else return ask2(a[p].ls, l, mid, s, t, str);
}
#undef mid
}T;
template<typename T> int cmp(T a, T b){
if (a > b) return 1;
else if (a == b) return 0;
else return -1;
}
struct Msg2{
int tp, len, num;
Msg2(){}
Msg2(int tp, int len, int num) : tp(tp), len(len), num(num) {}
};
struct Msg3{
int l, r, k;
Msg3(){}
Msg3(int l, int r, int k) : l(l), r(r), k(k) {}
};
int C;
struct Compare{
int k1;
Str str;
int pos[N], state[N], lstpos[N];
void init(int l, int r, int k){
k1 = k;
str.init(l, r, k1);
for (int i = 1; i <= n + lim; i++) lstpos[i] = str.b[i] ? i : lstpos[i - 1];
for (int i = 1; i <= n; i++){
pos[i] = T.ask2(rt[i], 1, n + lim, prehigh[i], str.highbit, str);
if (pos[i] == 0){
int d = str.highbit - prehigh[i];
if (d > 0 && lstpos[d]){
pos[i] = lstpos[d] - d;
state[i] = 1;
}else pos[i] = -inf;
}else state[i] = cmp(str.ask(str.highbit - (prehigh[i] - pos[i])), T.ask(rt[i], 1, n + lim, pos[i]).a1);
}
}
int ask(int l, int r, int k2){C++;
vector<Msg2> vec; int ph;
if (r - l <= lim){
ull x = sum[l][r - l], bits = 63 ^ __builtin_clzll(x);
ph = l + bits;
if (bits >= lim) vec = {Msg2(0, lim, x & ((1 << lim) - 1)), Msg2(0, bits - lim + 1, x >> lim)};
else vec = {Msg2(0, bits + 1, x)};
}else{
int a = sum2[l], b = pre2[l - 1] / 2;
if (a >= b) vec = {Msg2(0, lim, a - b), Msg2(2, prehigh[r] - (l + lim - 1), 0)}, ph = prehigh[r];
else{
int p = suf1[l + lim] < r ? suf1[l + lim] : r + __builtin_ctz(pre2[r]);
if (p < prehigh[r]) vec = {Msg2(0, lim, (1 << lim) + a - b), Msg2(1, p - (l + lim), 1), Msg2(1, 1, 0), Msg2(2, prehigh[r] - p, 0)}, ph = prehigh[r];
else vec = {Msg2(0, lim, (1 << lim) + a - b), Msg2(1, p - (l + lim), 1)}, ph = prehigh[r] - 1;
}
}
if (str.highbit + k1 != ph + k2) return cmp(str.highbit + k1, ph + k2);
int curlen = 0;
while (!vec.empty()){
Msg2 msg = vec.back();
vec.pop_back();
Msg res = str.ask(str.highbit - curlen - msg.len + 1, str.highbit - curlen);
if (msg.tp == 0){
int a = res.a1, b = msg.num;
if (a != b) return cmp(a, b);
}else if (msg.tp == 1){
if (msg.num == 0 && !same(res, Msg(msg.len, 0, 0))) return 1;
else if (msg.num == 1 && !same(res, all1[msg.len])) return -1;
}else if (msg.tp == 2){
if (ph - pos[r] < msg.len) return state[r];
}
curlen += msg.len;
}
if (curlen <= str.highbit - str.lowbit) return 1;
else return 0;
}
}C1, C2;
int f[N][lim + 5];
struct tree2{
#define mid ((l + r) >> 1)
#define ls (now << 1)
#define rs (now << 1 | 1)
int a[N << 2];
void build(int now, int l, int r){
a[now] = inf;
if (l == r) return;
build(ls, l, mid);
build(rs, mid + 1, r);
}
void add(int now, int l, int r, int s, int k){
if (l == r){
a[now] = k;
return;
}
if (s <= mid) add(ls, l, mid, s, k);
else add(rs, mid + 1, r, s, k);
a[now] = min(a[ls], a[rs]);
}
int ask(int now, int l, int r, int s, int t){
if (s <= l && r <= t)
return a[now];
int res = inf;
if (s <= mid) res = min(ask(ls, l, mid, s, t), res);
if (t > mid) res = min(ask(rs, mid + 1, r, s, t), res);
return res;
}
#undef mid
#undef ls
#undef rs
}T2;
bool check(Msg3 curans){
C1.init(curans.l, curans.r, curans.k);
T2.build(1, 0, n);
T2.add(1, 0, n, 0, 0);
for (int i = 1; i <= n; i++){
int rr = i - 1;
bool flg = 0;
for (int j = 0; j < lim && i + j <= n; j++)
if (flg || C1.ask(i, i, n - (i + j)) >= 0){
while (i - rr <= lim && rr > 0 && C1.ask(rr, i, n - (i + j)) >= 0) rr--;
if (i - rr > lim){
int l = 0, r = rr, mid;
while (l <= r){
mid = (l + r) >> 1;
if (C1.ask(mid + 1, i, n - (i + j)) >= 0) r = mid - 1;
else l = mid + 1;
}
rr = l;
}
f[i][j] = j ? f[i][j - 1] : inf;
if (rr >= 0 && rr < i - lim) f[i][j] = min(T2.ask(1, 0, n, rr, i - lim - 1) + i + j - 1, f[i][j]);
for (int k = max(i - lim, rr); k < i; k++) f[i][j] = min(f[k][min(lim - 1, j + (i - k - 1))] + i - k - 1 + j, f[i][j]);
flg = 1;
}else f[i][j] = inf;
T2.add(1, 0, n, i, f[i][lim - 1] - i);
}
return f[n][0] <= K;
}
void solve(){
cin >> n >> K;
T.tot = 0;
for (int i = 0; i <= n + lim; i++) cur[i] = 0;
T.build(rt[0], 1, n + lim);
for (int i = 1; i <= n; i++){
rt[i] = rt[i - 1];
cin >> a[i];
int c = 0;
prehigh[i] = prehigh[i - 1];
for (int j = 0; j < lim; j++){
c = c + ((a[i] >> j) & 1) + cur[i + j];
if (cur[i + j] != c % 2) T.add(rt[i], rt[i], 1, n + lim, i + j, c % 2);
cur[i + j] = c % 2;
if (c) prehigh[i] = max(i + j, prehigh[i]);
c /= 2;
}
pre2[i] = pre2[i - 1] / 2 + a[i];
}
suf1[n + lim + 1] = n + lim + 1;
for (int i = n + lim; i >= 1; i--) suf1[i] = cur[i] ? i : suf1[i + 1];
for (int i = 1; i <= n + lim; i++){
sum2[i] = 0;
for (int j = 0; j < lim && i + j <= n + lim; j++)
if (cur[i + j])
sum2[i] |= 1 << j;
}
for (int l = 1; l <= n; l++){
ull cur = 0;
for (int r = l; r <= n && r - l <= lim; r++){
cur += (1ll * a[r]) << (r - l);
sum[l][r - l] = cur;
}
}
Msg3 Ml(1, 1, 0), Mr(1, n, n - 1), Mmid, ans;
for (int i = 2; i <= n && i - Ml.l <= lim; i++)
if (((1ll * a[i]) << (i - Ml.l)) < a[Ml.l])
Ml = Msg3(i, i, 0);
while (1){
C1.init(Ml.l, Ml.r, Ml.k);
C2.init(Mr.l, Mr.r, Mr.k);
vector<array<int, 4>> vec;
for (int i = 1; i <= n; i++){
int l = i + 1, r = i;
for (int j = 0; i + j <= n && j < lim; j++){
if (r > 0 && C1.ask(r, i, n - (i + j)) != -1){
int l2 = 1, r2 = r - 1, mid;
while (l2 <= r2){
mid = (l2 + r2) >> 1;
if (C1.ask(mid, i, n - (i + j)) == -1) l2 = mid + 1;
else r2 = mid - 1;
}
r = r2;
}
if (l > 1 && C2.ask(l - 1, i, n - (i + j)) == 1){
int l2 = 1, r2 = l - 1, mid;
while (l2 <= r2){
mid = (l2 + r2) >> 1;
if (C2.ask(mid, i, n - (i + j)) == 1) r2 = mid - 1;
else l2 = mid + 1;
}
l = l2;
}
if (l <= r) vec.push_back({i, n - (i + j), l, r});
}
}
long long sz = 0;
for (auto [r, k, l1, l2] : vec) sz += l2 - l1 + 1;
if (sz == 0) break;
long long mid = (rnd() | ((1ll * rnd()) << 31)) % sz;
for (auto [r, k, l1, l2] : vec)
if (mid >= l2 - l1 + 1) mid -= l2 - l1 + 1;
else{
Mmid = Msg3(l1 + mid, r, k);
break;
}
if (check(Mmid)) Mr = Mmid;
else Ml = Mmid;
}
ans = check(Ml) ? Ml : Mr;
for (int i = 1; i <= n + lim; i++) cur[i] = 0;
for (int i = ans.l; i <= ans.r; i++){
int c = 0;
for (int j = 0; j < lim; j++){
c = c + ((a[i] >> j) & 1) + cur[i + j + ans.k];
cur[i + j + ans.k] = c % 2;
c /= 2;
}
}
int i = n + lim;
while (cur[i] == 0) i--;
for (; i >= 0; i--) cout << cur[i];
cout << endl;
}
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
pw1[0] = pw2[0] = inv1[0] = inv2[0] = 1;
for (int i = 1; i < N * 2; i++){
pw1[i] = 2ll * pw1[i - 1] % mod1;
pw2[i] = 2ll * pw2[i - 1] % mod2;
inv1[i] = 1ll * inv1[i - 1] * ((mod1 + 1) / 2) % mod1;
inv2[i] = 1ll * inv2[i - 1] * ((mod2 + 1) / 2) % mod2;
}
all1[1] = Msg(1, 1, 1);
for (int i = 2; i < N; i++) all1[i] = all1[i - 1] + all1[1];
cin >> tt;
while (tt--) solve();
return C;
}
詳細信息
Subtask #1:
score: 0
Runtime Error
Test #1:
score: 0
Runtime Error
input:
5 6 1 11764 28428 28179 18698 6443 20288 6 3 29 17548 61962 31242 8172 4107 6 15 7 2 239427 137145 171239 3 6 4 294 211 407 190 2 2 6 5 197190 265870 12121 144584 21313 14169
output:
110111100001100000000 101110011000100110000 11101001110100001100000 11000110110000 10100110100010001101100
result:
Subtask #2:
score: 0
Skipped
Dependency #1:
0%
Subtask #3:
score: 0
Skipped
Dependency #2:
0%
Subtask #4:
score: 0
Skipped
Dependency #3:
0%
Subtask #5:
score: 0
Runtime Error
Test #60:
score: 0
Runtime Error
input:
1666 6 1 282 719 29 355 388 275 6 1 348 766 91 299 474 96 6 23 5 2 8554 8554 8554 2 6 1 84 195 23 37 120 117 6 3 8 3 51 62 28 5 6 3 3 64 64 4 4 2 6 9 5 552 552 552 552 5 6 3 3611 1144 417 3461 459 755 6 3 777 315 1007 5 2 1061 6 6 1300 2101 4 1877 360 2434 6 1 384 713 168 25 524 390 6 3 203 18 305 1...
output:
110000100100000 111011010000000 1000010110111000000 1111000100000 11111000000 11110000000 100011001000000 100010001101100000 10000100101000000 100110000010000000 1000001100100000 10011001100000 111001011010000000 1100000110100000 1110111111110000 101011111000000 1000011110000 100101000000000 1011110...
result:
Subtask #6:
score: 0
Runtime Error
Test #80:
score: 0
Runtime Error
input:
3333 6 1000000000 131727 7 4 170194 6 59263 6 1000000000 417714 286613 7 310122 6 4 6 1000000000 63764 2430 2696 6699 8478 22261 6 1000000000 217 131 6 1487 2927 2 6 1000000000 26225 27991 3842 72525 4521 5231 6 1000000000 34409 26001 23563 19345 30764 24919 6 1000000000 97981 138532 59280 82393 128...
output:
10100110001101001000000 10010111011100001100000 101011011110101000000 10110111001100000 110010000010110110000 111100110010110100000 11111011000100010000000 11001111100101100 1100000101001001010100000 100000000000 100111000110001000000 101110110010100111000000 10000000000000000000000 1100000111101000...
result:
Subtask #7:
score: 0
Skipped
Dependency #4:
0%