- 数列分块入门 2
TJ
- 2024-2-1 10:13:15 @
/* created by chjshen, date: 2023-12-08 10:13 */
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = 5E4 + 5;
int n, opt, c;
long long a[N], add[N], b[N];
int l[N], r[N], pos[N];
int blockLen, blockNum;
void query(int L, int R)
{
int ans = 0;
long long C = 1LL * c * c;
int p = pos[L], q = pos[R];
if (p == q)
{
for (int i = L; i <= R; i++)
if (a[i] + add[p] < C) ans++;
}
else
{
for (int i = p + 1; i <= q - 1; i++)
{
// binary_search
int res = -1;
int left = l[i], right = r[i];
while (left <= right)
{
int mid = (right + left) / 2;
if (b[mid] + add[i] < C)
{
left = mid + 1;
res = mid;
}
else
right = mid - 1;
}
if (res != -1)
{
ans += (res - l[i] + 1);
}
}
for (int i = L; i <= r[p]; i++)
if (a[i] + add[p] < C) ans++;
for (int i = l[q]; i <= R; i++)
if (a[i] + add[q] < C) ans++;
}
printf("%d\n", ans);
}
void modify(int L, int R)
{
int p = pos[L], q = pos[R];
if (p == q)
{
for (int i = L; i <= R; i++) a[i] += c;
for (int i = l[p]; i <= r[p]; i++) b[i] = a[i];
sort(b + l[p], b + r[p] + 1);
}
else
{
for (int i = p + 1; i <= q - 1; i++) add[i] += c;
for (int i = L; i <= r[p]; i++) a[i] += c;
for (int i = l[p]; i <= r[p]; i++) b[i] = a[i];
sort(b + l[p], b + r[p] + 1);
for (int i = l[q]; i <= R; i++) a[i] += c;
for (int i = l[q]; i <= r[q]; i++) b[i] = a[i];
sort(b + l[q], b + r[q] + 1);
}
}
void handle()
{
for (int i = 1; i <= n; i++)
{
int l, r;
scanf("%d%d%d%d", &opt, &l, &r, &c);
if (opt == 0)
modify(l, r);
else
query(l, r);
}
}
void initInput()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%lld", &a[i]), b[i] = a[i];
// block init
blockNum = sqrt(n);
blockLen = n / blockNum;
for (int i = 1; i <= blockNum; i++)
{
l[i] = (i - 1) * blockLen + 1;
r[i] = i * blockLen;
for (int j = l[i]; j <= r[i]; j++) pos[j] = i;
sort(b + l[i], b + r[i] + 1);
}
if (n > blockNum * blockLen)
{
blockNum++;
l[blockNum] = (blockNum - 1) * blockLen + 1;
r[blockNum] = n;
sort(b + l[blockNum], b + n + 1);
for (int j = l[blockNum]; j <= n; j++) pos[j] = blockNum;
}
}
int main(void)
{
initInput();
handle();
return 0;
}
2 条评论
-
hehejushi LV 8 @ 2024-2-1 10:14:59
hp
-
2024-2-1 10:14:40@
qp
- 1
信息
- ID
- 2597
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 131
- 已通过
- 26
- 上传者