社区讨论
求条(必关)
题目总版参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mlk8qvsu
- 此快照首次捕获于
- 2026/02/13 10:00 6 天前
- 此快照最后确认于
- 2026/02/15 20:40 4 天前
任调出其一就关。
code1:
CPP#include <bits/stdc++.h>
using namespace std;
const int N = 6e5 + 10;
int len, n, lis[N], sz[N], tot, a[N];
vector <int> bl[N];
inline void insert (int pos, int c) {
int id = 0;
while (pos > sz[id + 1]) pos -= sz[++id];
id++;
bl[lis[id]].push_back (0);
sz[lis[id]]++;
for (int i = sz[lis[id]]; i > pos; i--)
bl[lis[id]][i - 1] = bl[lis[id]][i - 2];
bl[lis[id]][pos - 1] = c;
if (sz[id] == 2 * len) {
for (int i = tot + 1; i > id + 1; i--)
lis[i] = lis[i - 1];
lis[id + 1] = ++tot;
sz[lis[id]] = len, sz[tot] = len;
for (int i = len; i < 2 * len; i++)
bl[tot].push_back (bl[lis[id]][i]);
}
}
inline int query (int pos) {
int id = 0;
while (pos > sz[id + 1]) pos -= sz[++id];
return bl[lis[id + 1]][pos - 1];
}
int main () {
ios :: sync_with_stdio (0);
cin.tie (0), cout.tie (0);
cin >> n;
len = sqrt (n);
for (int i = 1; i <= n; i++) {
cin >> a[i];
if ((i - 1) % len == 0) {tot++; sz[tot] = len;}
bl[tot].push_back (a[i]);
lis[tot] = tot;
}
int q = n;
while (q--) {
int op, pos, c;
cin >> op;
if (op == 0) {
cin >> pos >> c;
insert (pos, c);
}
else {
cin >> pos;
cout << query (pos) << "\n";
}
/* for (int i = 1; i <= tot; i++)
cout << lis[i] << " ";
cout << "\n";
for (int i = 1; i <= tot; i++) {
cout << i << ":\n";
for (int j = 0; j < sz[i]; j++)
cout << bl[i][j] << " ";
cout << "\n";
}*/
}
return 0;
}
code2:
CPP#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 3e5 + 5, mod = 10007;
int add[N], mul[N], id[N], n, a[N], len;
inline void update_add (int l, int r, int c) {
int s = id[l], e = id[r];
if (s == e) {
for (int i = (s - 1) * len + 1; i <= min (n, s * len); i++)
a[i] = (a[i] * mul[id[i]] % mod + add[id[i]]) % mod;
for (int i = l; i <= r; i++)
a[i] = (a[i] + c) % mod;
add[s] = 0, mul[s] = 1;
return;
}
for (int i = (s - 1) * len + 1; i <= s * len; i++)
a[i] = (a[i] * mul[id[i]] % mod + add[id[i]]) % mod;
for (int i = l; id[i] == s; i++)
a[i] = (a[i] + c) % mod;
add[s] = 0, mul[s] = 1;
for (int i = (e - 1) * len + 1; i <= min (n, e * len); i++)
a[i] = (a[i] * mul[id[i]] % mod + add[id[i]]) % mod;
for (int i = r; id[i] == e; i--)
a[i] = (a[i] + c) % mod;
add[e] = 0, mul[e] = 1;
for (int i = s + 1; i < e; i++)
add[i] = (c + add[i]) % mod;
}
inline void update_mul (int l, int r, int c) {
int s = id[l], e = id[r];
if (s == e) {
for (int i = (s - 1) * len + 1; i <= min (n, s * len); i++)
a[i] = (a[i] * mul[id[i]] % mod + add[id[i]]) % mod;
for (int i = l; i <= r; i++)
a[i] = a[i] * c % mod;
add[s] = 0, mul[s] = 1;
return;
}
for (int i = (s - 1) * len + 1; i <= s * len; i++)
a[i] = (a[i] * mul[id[i]] % mod + add[id[i]]) % mod;
for (int i = l; id[i] == s; i++)
a[i] = a[i] * c % mod;
add[s] = 0, mul[s] = 1;
for (int i = (e - 1) * len + 1; i <= min (n, e * len); i++)
a[i] = (a[i] * mul[id[i]] % mod + add[id[i]]) % mod;
for (int i = r; id[i] == e; i--)
a[i] = a[i] * c % mod;
add[e] = 0, mul[e] = 1;
for (int i = s + 1; i < e; i++) {
add[i] = add[i] * c % mod;
mul[i] = mul[i] * c % mod;
}
}
inline int query (int x) {
return ((a[x] * mul[id[x]] % mod + add[x]) % mod + mod) % mod;
}
signed main () {
ios :: sync_with_stdio (0);
cin.tie (0), cout.tie (0);
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
len = sqrt (n);
for (int i = 1; i <= n; i++) {
id[i] = (i - 1) / len + 1;
mul[id[i]] = 1;
}
int q = n;
while (q--) {
int op, l, r, c;
cin >> op >> l >> r >> c;
c = (c % mod + mod) % mod;
if (op == 0) update_add (l, r, c);
else if (op == 1) update_mul (l, r, c);
else cout << query (r) << "\n";
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...