社区讨论
求调
P13981数列分块入门 6参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mlhfkoq4
- 此快照首次捕获于
- 2026/02/11 10:48 4 周前
- 此快照最后确认于
- 2026/02/12 21:10 4 周前
求调,求调,求调
代码:
CPP#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 6e5;
int n, a[N + 5], len;
vector<int> v[N + 5];
auto atit(int p) {
int np = 0;
for (int i = 0; ; i ++)
if (np + v[i].size() < p)
np += v[i].size();
else
return v[i].begin() + (p - np - 1);
}
int atblock(int p) {
int np = 0;
for (int i = 0; ; i ++)
if (np + v[i].size() < p)
np += v[i].size();
else
return i;
}
void rebuild() {
int curr = 0;
for (int i = 0; !v[i].empty(); i ++)
for (int vt : v[i])
a[++ curr] = vt;
for (int i = 0; !v[i].empty(); i ++)
v[i].clear();
n = curr;
len = sqrt(curr);
for (int i = 1; i <= n; i ++)
v[i / len].emplace_back(a[i]);
}
signed main() {
#ifndef ONLINE_JUDGE
freopen("in.in", "r", stdin);
#endif
scanf("%lld", &n);
len = sqrt(n);
for (int i = 1; i <= n; i ++)
scanf("%lld", a+i), v[i / len].emplace_back(a[i]);
int optcnt = 0;
for (int q = 1; q <= n; q ++) {
int opt;
scanf("%lld", &opt);
if (opt == 0) {
int p, x;
scanf("%lld%lld", &p, &x);
v[atblock(p)].emplace(atit(p), x);
optcnt ++;
if (optcnt >= 10 * len)
optcnt = 0, rebuild();
}
else {
int c;
cin >> c;
printf("%lld\n", *atit(c));
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...