QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#775513#9791. Intrusive Donkeyucup-team059#WA 1ms5880kbC++203.3kb2024-11-23 16:07:312024-11-23 16:07:31

Judging History

你现在查看的是最新测评结果

  • [2024-11-23 16:07:31]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:5880kb
  • [2024-11-23 16:07:31]
  • 提交

answer

#include <bits/stdc++.h>

#define ll long long

constexpr int N = 2E5 + 7;
int n, q;
ll a[N];
struct tag{
	ll mul, add;
};
struct Node{
	ll val, siz;
	tag t;
}seg[N * 4];

tag operator + (const tag &t1, const tag &t2){
	return {t1.mul * t2.mul, (t1.add * t2.mul + t2.add)};
}
void update(int id){
	seg[id].val = seg[id * 2].val + seg[id * 2 + 1].val;
}
void settag(int id, tag t){
	seg[id].t = seg[id].t + t;
	seg[id].val = seg[id].val * t.mul + t.add * seg[id].siz;
}

void pushdown(int id){
	if (seg[id].t.mul != 1 || seg[id].t.add != 0){
		settag(id * 2, seg[id].t);
		settag(id * 2 + 1, seg[id].t);
		seg[id].t = {1, 0};
	}
}
void build(int id, int l, int r){
	seg[id].siz = r - l + 1;
	seg[id].t = {1, 0};
	if (l == r){
		seg[id].val = a[l];
		return;
	}
	int mid = l + r >> 1;
	build(2 * id, l, mid);
	build(2 * id + 1, mid + 1, r);
	update(id);
}
void modify(int id, int l, int r, int ql, int qr, tag t){
	if (l == ql && r == qr){
		settag(id, t);
		return;
	}
	pushdown(id);
	int mid = l + r >> 1;
	if (qr <= mid){
		modify(id * 2, l, mid, ql, qr, t);
	}else if (ql > mid){
		modify(id * 2 + 1, mid + 1, r, ql, qr, t);
	}else{
		modify(id * 2, l, mid, ql, mid, t);
		modify(id * 2 + 1, mid + 1, r, mid + 1, qr, t);
	}
	update(id);
}
ll query(int id, int l, int r, int ql, int qr){
	if (l == ql && r == qr){
		return seg[id].val;
	}
	pushdown(id);
	int mid = l + r >> 1;
	if (qr <= mid){
		return query(id * 2, l, mid, ql, qr);
	}else if (ql > mid){
		return query(id * 2 + 1, mid + 1, r, ql, qr);
	}else{
		return query(id * 2, l, mid, ql, mid) + query(id * 2 + 1, mid + 1, r, mid + 1, qr);
	}
}
ll pre(int i){
	return query(1, 1, n, 1, i);
}
int upper(int id, int l, int r, ll val){ // >= val , idx 
	if (l == r){
		return l;
	}
	int mid = l + r >> 1;
	if (seg[2 * id].val < val){
		val -= seg[2 * id].val;
		return upper(2 * id + 1, mid + 1, r, val);
	}else{
		return upper(2 * id, l, mid, val);
	}
}


int main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	
	
	std::cin >> n >> q;
	std::string s;
	std::cin >> s;
	s = " " + s;
	for (int i = 1; i <= n; i++){
		a[i] = 1;
	}
	build(1, 1, n);
	// std::cout << seg
	while (q--){
		ll op;
		std::cin >> op;
		if (op == 1){
			ll l, r;
			std::cin >> l >> r;
			ll idxl = upper(1, 1, n, l);
			ll idxr = upper(1, 1, n, r); 
			// std::cerr << idxl << ' ' << idxr << '\n';
			ll addl = pre(idxl) - l + 1;
			// std::cerr << "ZZZ" << idxl << ' ' << idxr << '\n';
			if (idxl != idxr){
				ll addr = query(1, 1, n, idxr, idxr) - (pre(idxr) - r);
				// std::cout << "AAA" << addl << " " << addr << '\n';
				modify(1, 1, n, idxr, idxr, tag{1, addr});
				// idxl++;
				// idxr--;
				if (idxl + 1 <= idxr - 1){
					modify(1, 1, n, idxl + 1, idxr - 1, tag{2, 0});
				}
				modify(1, 1, n, idxl, idxl, tag{1, addl});
				// for (int i = 1; i <= n; i++){
				// 	std::cout << query(1, 1, n, i, i) << " \n"[i == n];
				// }
				// for (int i = 1; i <= n; i++){
				// 	std::cout << pre(i) << " \n"[i == n];
				// }
			}else{
				modify(1, 1, n, idxl, idxl, tag{1, addl});
			}
		}else{
			ll x;
			std::cin >> x;
			std::cout << s[upper(1, 1, n, x)] << '\n';
		}
		// for (int i = 1; i <= n; i++){
		// 	std::cout << query(1, 1, n, i, i) << " \n"[i == n];
		// }
		// std::cerr << "SSSS\n";
	}


	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 5652kb

input:

4 7
abac
2 2
2 3
1 2 3
2 3
2 4
2 5
2 6

output:

b
a
b
a
a
c

result:

ok 6 lines

Test #2:

score: 0
Accepted
time: 1ms
memory: 5604kb

input:

5 4
shrek
1 1 2
2 7
1 1 7
2 7

output:

k
h

result:

ok 2 lines

Test #3:

score: 0
Accepted
time: 0ms
memory: 3616kb

input:

4 7
abac
2 2
2 3
1 2 3
2 3
2 4
2 5
2 6

output:

b
a
b
a
a
c

result:

ok 6 lines

Test #4:

score: 0
Accepted
time: 1ms
memory: 5652kb

input:

5 4
shrek
1 1 2
2 7
1 1 7
2 7

output:

k
h

result:

ok 2 lines

Test #5:

score: -100
Wrong Answer
time: 1ms
memory: 5880kb

input:

3 55
vfe
1 2 3
1 2 2
1 3 5
2 4
1 1 2
2 9
2 7
2 5
1 10 10
1 1 1
2 9
1 8 12
2 8
1 7 10
2 1
1 5 6
1 1 4
1 20 24
1 14 32
1 19 38
2 48
1 56 64
2 58
2 19
1 64 72
1 36 86
2 11
1 117 124
2 38
2 108
2 85
1 112 118
2 153
2 40
2 114
2 80
1 11 18
2 27
2 73
1 159 162
2 84
1 130 164
2 163
2 65
1 150 156
1 101 109...

output:

f
f
f
f
f
f
v
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
f
v

result:

wrong answer 2nd lines differ - expected: 'e', found: 'f'