SP19543 GSS8 - Can you answer these queries VIII 题解
插入删除区间查询,考虑直接在平衡树上维护答案。
设
这样就可以直接合并两棵子树的答案了。
#include <cstdio>
#include <cstdlib>
#define int unsigned
char o;
int n, m, C[15][15], p[300050][15];
struct T
{
T *l, *r;
int v, q[11], k, s;
T(int _) : l(0), r(0), v(_), k(rand()), s(1)
{
for (int i = 0; i <= 10; ++i)
q[i] = _;
}
void u()
{
s = 1;
if (l)
s += l->s;
if (r)
s += r->s;
int z = l ? l->s : 0;
for (int i = 0; i <= 10; ++i)
{
q[i] = v * p[z + 1][i];
if (l)
q[i] += l->q[i];
if (r)
for (int j = 0; j <= i; ++j)
q[i] += C[i][j] * p[z + 1][i - j] * r->q[j];
}
}
} *r, *a, *b, *c;
void S(T *x, int k, T *&a, T *&b)
{
if (!x)
return void(a = b = 0);
int z = x->l ? x->l->s : 0;
if (z >= k)
b = x, S(x->l, k, a, b->l), b->u();
else
a = x, S(x->r, k - z - 1, a->r, b), a->u();
}
T *M(T *a, T *b)
{
if (!a)
return b;
if (!b)
return a;
if (a->k < b->k)
return a->r = M(a->r, b), a->u(), a;
else
return b->l = M(a, b->l), b->u(), b;
}
signed main()
{
C[0][0] = 1;
for (int i = 1; i <= 10; ++i)
{
C[i][0] = 1;
for (int j = 1; j <= i; ++j)
C[i][j] = C[i - 1][j] + C[i - 1][j - 1];
}
for (int i = 0; i <= 3e5; ++i)
for (int j = p[i][0] = 1; j <= 10; ++j)
p[i][j] = p[i][j - 1] * i;
scanf("%u", &n);
for (int i = 1, x; i <= n; ++i)
scanf("%u", &x), r = M(r, new T(x));
scanf("%u", &m);
for (int i = 0, x, y, k; i < m; ++i)
{
scanf(" %c%u", &o, &x);
switch (o)
{
case 'I':
scanf("%u", &y);
S(r, x, a, b);
r = M(a, M(new T(y), b));
break;
case 'D':
S(r, x, a, b);
S(b, 1, b, c);
r = M(a, c);
break;
case 'R':
scanf("%u", &y);
S(r, x, a, b);
S(b, 1, b, c);
r = M(a, M(new T(y), c));
break;
case 'Q':
scanf("%u%u", &y, &k);
S(r, y + 1, a, c);
S(a, x, a, b);
printf("%u\n", b->q[k]);
r = M(a, M(b, c));
break;
}
}
return 0;
}
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具