社区讨论
50求调
P2801教主的魔法参与者 3已保存回复 12
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 12 条
- 当前快照
- 1 份
- 快照标识符
- @mjnwqp2w
- 此快照首次捕获于
- 2025/12/27 14:16 2 个月前
- 此快照最后确认于
- 2025/12/29 16:40 2 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 100;
int n, q, blo, bl[N], a[N], tag[N];
void update(int l, int r, int k) {
if (bl[l] == bl[r]) {
for (int i = l; i <= r; i ++) {
a[i] += k;
}
return ;
}
for (int i = l; i <= bl[l] * blo; i ++) {
a[i] += k;
}
for (int i = bl[l] + 1; i <= bl[r] - 1; i ++) {
tag[i] += k;
}
for (int i = (bl[r] - 1) * blo + 1; i <= r; i ++) {
a[i] += k;
}
return ;
}
int ef(int s, int c) {
int ans = 0;
int l = (s - 1) * blo + 1;
int r = s * blo;
// cout << l << " " << r << "\n";
sort (a + l, a + r + 1);
while (l + 1 < r) {
int mid = (l + r) / 2;
if (a[mid] >= c) {
r = mid;
}
else {
l = mid;
}
}
if (a[l] >= c) {
ans = s * blo - l + 1;
}
else {
ans = s * blo - r + 1;
}
return ans;
}
void anser(int l, int r, int c) {
int ans = 0;
if (bl[l] == bl[r]) {
for (int i = l; i <= r; i ++) {
if (a[i] >= c) {
ans ++;
}
}
cout << ans << "\n";
return ;
}
for (int i = l; i <= bl[l] * blo; i ++) {
if (a[i] >= c) {
// cout << a[i] << "\n";
ans ++;
}
}
for (int i = (bl[r] - 1) * blo + 1; i <= r; i ++) {
if (a[i] >= c) {
ans ++;
// cout << a[i] << "\n";
}
}
// cout << ans << "\n";
for (int i = bl[l] + 1; i <= bl[r] - 1; i ++) {
ans += ef(i, c - tag[i]);
// cout << ef(i, c - tag[i]) << "\n\n";
}
cout << ans << "\n";
return ;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> q;
blo = sqrt(n);
for (int i = 1; i <= n; i ++) {
cin >> a[i];
bl[i] = (i - 1) / blo + 1;
}
while (q --) {
char op;
cin >> op;
if (op == 'M') {
int l, r, w;
cin >> l >> r >> w;
update(l, r, w);
}
else {
int l, r, c;
cin >> l >> r >> c;
anser(l, r, c);
}
}
return 0;
}
回复
共 12 条回复,欢迎继续交流。
正在加载回复...