ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#197058 | #3428. D | FAT | 100 | 13632ms | 179888kb | C++11 | 4.7kb | 2023-11-05 12:27:23 | 2023-11-05 13:04:10 |
answer
#include <bits/stdc++.h>
#define PB push_back
#define EB emplace_back
using namespace std;
struct IO {
char buf[1 << 23], *p1 = buf, *p2 = buf, obuf[1 << 23], *O = obuf;
~IO() { flush(); }
char nc() { return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 23, stdin), p1 == p2) ? EOF : *p1++; }
template <typename T = int>
T read() {
char ch = nc();
T sum = 0;
while (ch < '0' || ch > '9') ch = nc();
while (ch >= '0' && ch <= '9') sum = sum * 10 + ch - '0', ch = nc();
return sum;
}
void readStr(char str[]) {
int p = 0;
char ch = nc();
while (ch < '0' || ch > '1') ch = nc();
while (ch >= '0' && ch <= '1') str[p++] = ch, ch = nc();
}
void flush() { fwrite(obuf, O - obuf, 1, stdout); }
void pc(char c) { (O - obuf < (1 << 23)) ? (*O++ = c) : (flush(), O = obuf, *O++ = c); }
template <typename T>
void print(T x) {
if (x > 9) print(x / 10);
pc(x % 10 + '0');
}
} IO;
const int mod = 998244353;
inline int Mod(int x) { return x + ((x >> 31) & mod); }
inline int add(int x, int y) { return Mod(x + y - mod); }
inline int sub(int x, int y) { return Mod(x - y); }
inline int mul(int x, int y) { return 1ll * x * y % mod; }
inline int sqr(int x) { return 1ll * x * x % mod; }
const int maxn = 100000, maxq = 1000000, K = 20;
char str[maxn + 5];
int v[maxn + 5];
struct query { int l, r, k; } q[maxq + 5];
vector<int> qL[2 * maxn + 5];
void st(int p, int l, int r, int x, int y, int id) {
int mid = (l + r) / 2;
if (x <= mid && mid < y) return qL[p].PB(id), void();
if (y <= mid) st(p << 1, l, mid, x, y, id);
if (mid < x) st(p << 1 | 1, mid + 1, r, x, y, id);
}
int ans[maxq + 5];
int f[maxn + 5][2 * K + 5][2], fl[maxn + 5][2 * K + 5][2], fr[maxn + 5][2 * K + 5][2], flr[maxn + 5][2 * K + 5][2];
inline void upd(int& x, int y) { x = add(x, y); }
void solve(int p, int l, int r) {
if (l == r) return;
int mid = (l + r) / 2;
memset(f[mid], 0, sizeof(f[mid]));
memset(fl[mid], 0, sizeof(fl[mid]));
memset(fr[mid], 0, sizeof(fr[mid]));
memset(flr[mid], 0, sizeof(flr[mid]));
f[mid][1][v[mid]] = 1;
fl[mid][1][v[mid]] = fr[mid][1][v[mid]] = mid;
flr[mid][1][v[mid]] = sqr(mid);
for (int i = mid - 1; i >= l; i--) {
memcpy(f[i], f[i + 1], sizeof(f[i]));
memcpy(fl[i], fl[i + 1], sizeof(f[i])), memcpy(fr[i], fr[i + 1], sizeof(f[i]));
memcpy(flr[i], flr[i + 1], sizeof(f[i]));
for (int j = 0; j < 2 * K; j++) {
int s = (j ^ v[i]) & 1;
upd(f[i][j + 1][s], f[i + 1][j][s]);
upd(fr[i][j + 1][s], fr[i + 1][j][s]);
upd(fl[i][j + 1][s], mul(f[i + 1][j][s], i));
upd(flr[i][j + 1][s], mul(fr[i + 1][j][s], i));
}
int s = v[i];
upd(f[i][1][s], 1);
upd(fl[i][1][s], i), upd(fr[i][1][s], i);
upd(flr[i][1][s], sqr(i));
}
memset(f[mid + 1], 0, sizeof(f[mid + 1]));
memset(fl[mid + 1], 0, sizeof(fl[mid + 1]));
memset(fr[mid + 1], 0, sizeof(fr[mid + 1]));
memset(flr[mid + 1], 0, sizeof(flr[mid + 1]));
f[mid + 1][1][v[mid + 1]] = 1;
fl[mid + 1][1][v[mid + 1]] = fr[mid + 1][1][v[mid + 1]] = mid + 1;
flr[mid + 1][1][v[mid + 1]] = sqr(mid + 1);
for (int i = mid + 2; i <= r; i++) {
memcpy(f[i], f[i - 1], sizeof(f[i]));
memcpy(fl[i], fl[i - 1], sizeof(f[i])), memcpy(fr[i], fr[i - 1], sizeof(f[i]));
memcpy(flr[i], flr[i - 1], sizeof(f[i]));
for (int j = 0; j < 2 * K; j++) {
int s = (j ^ v[i]) & 1;
upd(f[i][j + 1][s], f[i - 1][j][s]);
upd(fl[i][j + 1][s], fl[i - 1][j][s]);
upd(fr[i][j + 1][s], mul(f[i - 1][j][s], i));
upd(flr[i][j + 1][s], mul(fl[i - 1][j][s], i));
}
int s = v[i];
upd(f[i][1][s], 1);
upd(fl[i][1][s], i), upd(fr[i][1][s], i);
upd(flr[i][1][s], sqr(i));
}
for (int id : qL[p]) {
int l = q[id].l, r = q[id].r, k = q[id].k;
upd(ans[id], sub(add(mul(fl[l][2 * k][1], r + 1), mul(fr[l][2 * k][1], l - 1)), add(mul(f[l][2 * k][1], mul(l - 1, r + 1)), flr[l][2 * k][1])));
upd(ans[id], sub(add(mul(fl[r][2 * k][0], r + 1), mul(fr[r][2 * k][0], l - 1)), add(mul(f[r][2 * k][0], mul(l - 1, r + 1)), flr[r][2 * k][0])));
for (int i = 1; i < 2 * k; i++) {
int s1 = ~i & 1, s2 = i & 1;
upd(ans[id], sub(add(mul(mul(fl[l][i][s1], f[r][2 * k - i][s2]), r + 1), mul(mul(f[l][i][s1], fr[r][2 * k - i][s2]), l - 1)), add(mul(mul(f[l][i][s1], f[r][2 * k - i][s2]), mul(l - 1, r + 1)), mul(fl[l][i][s1], fr[r][2 * k - i][s2]))));
}
}
solve(p << 1, l, mid), solve(p << 1 | 1, mid + 1, r);
}
int main() {
int n = IO.read(), Q = IO.read();
IO.readStr(str + 1);
for (int i = 1; i <= n; i++) v[i] = str[i] - '0';
for (int i = 1; i <= Q; i++) {
q[i].l = IO.read(), q[i].r = IO.read(), q[i].k = IO.read();
if (q[i].l < q[i].r) st(1, 1, n, q[i].l, q[i].r, i);
}
solve(1, 1, n);
for (int i = 1; i <= Q; i++) IO.print(ans[i]), IO.pc('\n');
}
Details
小提示:点击横条可展开更详细的信息
Subtask #1:
score: 10
Accepted
Test #1:
score: 10
Accepted
time: 0ms
memory: 6032kb
input:
93 96 001010101000001011000001000011010110110001001110110010011010000010111001011001001111110011100 ...
output:
0 7731 0 0 593953408 0 378402706 7193160 0 0 0 0 0 0 0 0 143064 0 0 301688192 0 0 900914707 14860 59...
result:
ok 96 lines
Test #2:
score: 0
Accepted
time: 0ms
memory: 6048kb
input:
100 93 001110111011101010110100010110111001011101100100111001111111000010000011100110011111100110011...
output:
0 0 5816800 0 60 5826107 0 23514624 0 0 0 2456808 0 734635172 0 0 61124148 0 878040 0 964 0 5640 471...
result:
ok 93 lines
Test #3:
score: 0
Accepted
time: 0ms
memory: 6040kb
input:
93 98 011101011111101000110011010010011110101001011111001000001101111101010000011110011010110011101 ...
output:
0 160000 0 0 0 0 0 3113768 0 0 0 0 0 0 2746 0 0 0 0 0 21000 0 0 800 0 0 888746112 773282352 0 120000...
result:
ok 98 lines
Test #4:
score: 0
Accepted
time: 0ms
memory: 6040kb
input:
95 100 111100100001110100111101110110101101100000001000011101000100001100001110011001011100101111011...
output:
0 651603415 6048 0 0 0 5913 24271 0 0 0 576 0 0 0 0 0 0 0 0 27869184 0 0 0 0 25442 0 0 0 350309304 4...
result:
ok 100 lines
Subtask #2:
score: 20
Accepted
Test #5:
score: 20
Accepted
time: 3ms
memory: 7276kb
input:
937 971 11001000101111101011011010000000010111111101001111111101110101001110110110001010101110100001...
output:
671442932 528941394 66868842 656617692 524077271 372343919 934251882 2060387 283009478 700 30944234 ...
result:
ok 971 lines
Test #6:
score: 0
Accepted
time: 4ms
memory: 7272kb
input:
940 954 11110001101110010101000101100010111010101010101110000011000001011011011110001100110101110101...
output:
346284467 731799177 419225156 533754366 918130294 680678451 36509148 17844040 56000769 0 374980892 4...
result:
ok 954 lines
Test #7:
score: 0
Accepted
time: 5ms
memory: 7332kb
input:
988 947 10101100010100011100011010011001010110001101100111100000110110100001011111101001111011110000...
output:
839112307 692149731 641350934 5874267 737720411 266432930 451903793 452753687 167083560 986407555 34...
result:
ok 947 lines
Test #8:
score: 0
Accepted
time: 0ms
memory: 7328kb
input:
982 924 00010000101001101001100111111011001111111101010011100001101000100110100011101010110001110110...
output:
943050275 152065917 0 556703443 243835133 953690415 227268010 368155073 59033965 764523388 578744653...
result:
ok 924 lines
Subtask #3:
score: 30
Accepted
Test #9:
score: 30
Accepted
time: 661ms
memory: 137540kb
input:
90435 92177 0111000001100110110100011000101111011011110001011011001001001100001000101001010010100010...
output:
873159770 222441359 208505849 774571175 527662144 980153989 932677897 631393338 531273268 24003561 4...
result:
ok 92177 lines
Test #10:
score: 0
Accepted
time: 649ms
memory: 137056kb
input:
90104 92675 1101001001000100001000101111010100110011001011101000011111001110111001101101100100001011...
output:
412479172 959196593 851587203 58940998 810926510 648152242 675167310 854347888 516182025 842470561 5...
result:
ok 92675 lines
Test #11:
score: 0
Accepted
time: 930ms
memory: 147732kb
input:
97546 95803 0100000011101100011101100100001111011010000110111100010010111011101010000000110010000100...
output:
761991320 171674508 712593816 989018031 22073010 5387178 102290208 591634157 750075209 648396373 147...
result:
ok 95803 lines
Test #12:
score: 0
Accepted
time: 789ms
memory: 148420kb
input:
98064 95657 0010001011000101110010001111010001111101011101100011101111101000011100010010000101001101...
output:
123114022 989881506 644314603 862292264 524847747 257018184 225864094 620595055 764329966 70155707 3...
result:
ok 95657 lines
Subtask #4:
score: 20
Accepted
Test #13:
score: 20
Accepted
time: 914ms
memory: 170580kb
input:
91952 929215 111011100100010100010011111110111111010001010100001110001101110010100010010101110010010...
output:
921201806 876849456 612277213 535534177 833432819 708795425 2708150 955768734 9370767 679297764 6536...
result:
ok 929215 lines
Test #14:
score: 0
Accepted
time: 972ms
memory: 176776kb
input:
95651 984225 000110000000111011101111111001011001011011010111101011010010101101101100000011110011010...
output:
952755535 170899085 247805785 226424600 499336673 995030524 715702968 602527073 262787038 467751993 ...
result:
ok 984225 lines
Test #15:
score: 0
Accepted
time: 960ms
memory: 175300kb
input:
94724 976469 101010001100101101011010010001011011110111010001010010111111000100110010011110001110000...
output:
606507075 137424596 740041747 661132541 125834462 524195835 985329563 338239054 25025950 620214678 6...
result:
ok 976469 lines
Test #16:
score: 0
Accepted
time: 937ms
memory: 170696kb
input:
92171 919192 110111001101011111111111100001011101011010011111101101011101000010101011100011000111111...
output:
655623142 944772923 175427103 824511219 542411656 824802067 407503277 271243631 82035009 764352052 7...
result:
ok 919192 lines
Subtask #5:
score: 20
Accepted
Test #17:
score: 20
Accepted
time: 1604ms
memory: 171980kb
input:
92883 931742 110000100101100000001110000101111111001001011110100100011100011010101010010100100001011...
output:
95428978 914061770 251951626 892608230 477011926 429178 775409037 61408347 871226304 802933662 94602...
result:
ok 931742 lines
Test #18:
score: 0
Accepted
time: 1816ms
memory: 172576kb
input:
93113 935900 001001001010110100100010010111011100011111101101111001100110110111100111000101001001011...
output:
155502022 407358276 300583373 139916264 972742794 656561555 551436385 987636663 812223432 160547012 ...
result:
ok 935900 lines
Test #19:
score: 0
Accepted
time: 1494ms
memory: 171100kb
input:
91665 979024 101011111010000110011100001000010110000000010001011111010111100010110001111001101000010...
output:
336155475 175515035 895848168 976631955 578355793 823374778 17381629 234935732 140583411 856145014 5...
result:
ok 979024 lines
Test #20:
score: 0
Accepted
time: 1894ms
memory: 179888kb
input:
98178 956829 001100000111110010000010111101001101000001010011111001100111101000100001001111010101100...
output:
102444181 387781969 785052525 956426925 555519094 262857348 611231851 669035012 616250091 682085961 ...
result:
ok 956829 lines
Extra Test:
score: 0
Extra Test Passed