UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#197058#3428. DFAT10013632ms179888kbC++114.7kb2023-11-05 12:27:232023-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');
} 

详细

小提示:点击横条可展开更详细的信息

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