社区讨论
求助卡常(T on 27)
SP19543GSS8 - Can you answer these queries VIII参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo2vklea
- 此快照首次捕获于
- 2023/10/23 20:29 2 年前
- 此快照最后确认于
- 2023/10/23 20:29 2 年前
CPP
#include <bits/stdc++.h>
using namespace std;
typedef unsigned int ll;
#define int unsigned int
const int maxn = 2e5+50;
const int maxk = 15;
const int K = 10;
ll R()
{
ll x = 0,f = 1;
char c = getchar();
while(c > '9' || c < '0')
{
if(c == '-')f = -1;
c = getchar();
}
while(c >= '0' && c <= '9')
{
x = (x << 1) + (x << 3) + (c ^ 48);
c = getchar();
}
return x * f;
}
#define ls(rt) t[rt].ls
#define rs(rt) t[rt].rs
#define siz(rt) t[rt].siz
#define val(rt) t[rt].val
#define reg register
ll tot,rot,a[maxn],p[maxk],C[maxk][maxk];
struct Tree{ ll ls,rs,siz,val,rval,ans[maxk]; }t[maxn];
inline void pushup(reg ll rt)
{
siz(rt) = siz(ls(rt)) + siz(rs(rt)) + 1;
p[0] = 1;
for(reg int i = 1 ; i <= K ; i++)p[i] = p[i-1] * (siz(ls(rt)) + 1);
for(reg int i = 0 ; i <= K ; i++)
{
t[rt].ans[i] = t[ls(rt)].ans[i] + val(rt) * p[i];
for(reg int j = 0 ; j <= i ; j++)t[rt].ans[i] += C[i][j] * p[i-j] * t[rs(rt)].ans[j];
}
}
mt19937 rd(time(0));
inline ll newnode(ll val)
{
++tot;
t[tot].ls = t[tot].rs = 0;
t[tot].siz = 1,t[tot].val = val,t[rot].rval = rd();
for(reg int i = 0 ; i <= K ; i++)t[tot].ans[i] = val;
return tot;
}
inline void split(ll rt,ll &x,ll &y,ll siz)
{
if(!rt){ x = y = 0; return; }
if(siz(ls(rt)) + 1 <= siz)
{
x = rt;
split(rs(rt),rs(rt),y,siz-siz(ls(rt))-1);
}
else
{
y = rt;
split(ls(rt),x,ls(rt),siz);
}
pushup(rt);
}
inline ll merge(ll x,ll y)
{
if(!x || !y)return x + y;
if(t[x].rval < t[y].rval)
{
rs(x) = merge(rs(x),y);
pushup(x);
return x;
}
else
{
ls(y) = merge(x,ls(y));
pushup(y);
return y;
}
}
char s[2];
void Lei()
{
C[0][0] = 1;
for(reg int i = 1 ; i <= K ; i++)
{
C[i][0] = 1;
for(reg int j = 1 ; j <= i ; j++)C[i][j] = C[i-1][j] + C[i-1][j-1];
}
ll n = R();
for(reg int i = 1 ; i <= n ; i++)a[i] = R(),rot = merge(rot,newnode(a[i]));
ll m = R(),pos,val,x,y,z;
for(reg int i = 1 ; i <= m ; i++)
{
scanf("%s",s+1);
if(s[1] == 'I')
{
pos = R(),val = R();
split(rot,x,y,pos);
x = merge(x,newnode(val));
rot = merge(x,y);
}
else if(s[1] == 'D')
{
pos = R();
split(rot,x,y,pos);
split(y,y,z,1);
rot = merge(x,z);
}
else if(s[1] == 'R')
{
pos = R(),val = R();
split(rot,x,y,pos);
split(y,y,z,1);
x = merge(x,newnode(val));
rot = merge(x,z);
}
else
{
ll l = R(),r = R()+1,k = R();
split(rot,x,y,r);
split(x,x,z,l);
printf("%u\n",t[z].ans[k]);
x = merge(x,z);
rot = merge(x,y);
}
}
}
signed main()
{
Lei();
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...