社区讨论
splay...过样例...10分...(哇的一声哭出来
P2042[NOI2005] 维护数列参与者 7已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @mi7yw37l
- 此快照首次捕获于
- 2025/11/21 05:52 4 个月前
- 此快照最后确认于
- 2025/11/21 05:52 4 个月前
已经调了
4天
了!
心态崩了,求巨佬来帮调啊qwq
测试点1 AC
测试点2 WA 第936行
测试点3 WA 第38行
测试点4 WA 第14行
测试点5 WA 第469行
测试点6 WA 第269行
测试点7 WA 第93行
测试点8 WA 第115行
测试点9 WA 第522行
测试点10 WA 第2217行
SOS救命啊,蒟蒻已经哭了
C#include <iostream>
#include <cstdio>
using namespace std;
const int N=5e5+5,INF=0x80000000;
int bin[N],btop;
int root,siz[N],val[N],son[N][2],fa[N],rtag[N],mstag[N],tl,sum[N],lmx[N],rmx[N],mx[N];
inline int chk(int pos) {return son[fa[pos]][1]==pos;}
inline void up(int pos)
{
int ls=son[pos][0],rs=son[pos][1];
siz[pos]=siz[ls]+siz[rs]+1;
sum[pos]=sum[ls]+sum[rs]+val[pos];
lmx[pos]=max(lmx[ls],sum[ls]+val[pos]+max(lmx[rs],0));
rmx[pos]=max(rmx[rs],sum[rs]+val[pos]+max(rmx[ls],0));
mx[pos]=max(max(mx[ls],mx[rs]),max(rmx[ls],0)+val[pos]+max(lmx[rs],0));
}
inline void apply_ms(int pos)
{
val[pos]=mstag[pos];
rtag[pos]^=1;
sum[pos]=val[pos]*siz[pos];
lmx[pos]=rmx[pos]=mx[pos]=max(sum[pos],val[pos]);
}
inline void apply_rev(int pos)
{
swap(son[pos][0],son[pos][1]);
swap(lmx[pos],rmx[pos]);
}
inline void down(int pos)
{
int ls=son[pos][0],rs=son[pos][1];
if(mstag[pos]!=INF)
{
if(ls) mstag[ls]=mstag[pos],apply_ms(ls);
if(rs) mstag[rs]=mstag[pos],apply_ms(rs);
mstag[pos]=INF,rtag[pos]^=1;
}
if(rtag[pos])
{
if(ls) rtag[ls]^=1,apply_rev(ls);
if(rs) rtag[rs]^=1,apply_rev(rs);
rtag[pos]^=1;
}
}
int tmpn[N];
int build(int l,int r)
{
int mid=(l+r)>>1,pos;
if(btop) pos=bin[btop--];
else pos=++tl;
val[pos]=tmpn[mid],mstag[pos]=INF;
son[pos][0]=son[pos][1]=0;
if(l<mid) son[pos][0]=build(l,mid-1),fa[son[pos][0]]=pos;
if(r>mid) son[pos][1]=build(mid+1,r),fa[son[pos][1]]=pos;
up(pos);
return pos;
}
inline void rotate(int pos)
{
int f=fa[pos],grf=fa[f],p=chk(pos),q=p^1;
son[f][p]=son[pos][q],fa[son[pos][q]]=f;
son[grf][chk(f)]=pos,fa[pos]=grf;
son[pos][q]=f,fa[f]=pos;
up(f),up(pos);
}
inline void splay(int pos,int aim)
{
while(fa[pos]!=aim)
{
int f=fa[pos],grf=fa[f];
if(grf!=aim)
{
if(chk(f)==chk(pos)) rotate(f);
else rotate(pos);
}
rotate(pos);
}
if(!aim) root=pos;
}
inline int kth(int k)
{
int pos=root;
while(1)
{
down(pos);
if(k<=siz[son[pos][0]]) pos=son[pos][0];
else if(k==siz[son[pos][0]]+1) return pos;
else k-=siz[son[pos][0]]+1,pos=son[pos][1];
}
}
inline void ins(int pos,int rt)
{
int pre=kth(pos+1),suc=kth(pos+2);
splay(pre,0),splay(suc,pre);
son[suc][0]=rt,fa[rt]=suc;
up(suc),up(pre);
}
void cyc(int pos)
{
if(son[pos][0]) cyc(son[pos][0]);
if(son[pos][1]) cyc(son[pos][1]);
bin[++btop]=pos;
}
inline void del(int pos,int len)
{
int pre=kth(pos),suc=kth(pos+len+1);
splay(pre,0),splay(suc,pre);
cyc(son[suc][0]),son[suc][0]=0;
up(suc),up(pre);
}
inline void make_same(int pos,int len,int va)
{
int pre=kth(pos),suc=kth(pos+len+1);
splay(pre,0),splay(suc,pre);
mstag[son[suc][0]]=va;
apply_ms(son[suc][0]);
up(suc),up(pre);
}
inline void reverse(int pos,int len)
{
int pre=kth(pos),suc=kth(pos+len+1);
splay(pre,0),splay(suc,pre);
if(mstag[son[suc][0]]!=INF) return;
rtag[son[suc][0]]^=1;
apply_rev(son[suc][0]);
up(suc),up(pre);
}
inline void getsum(int pos,int len)
{
int pre=kth(pos),suc=kth(pos+len+1);
splay(pre,0),splay(suc,pre);
printf("%d\n",sum[son[suc][0]]);
}
inline void getmx()
{
int pre=kth(1),suc=kth(siz[root]);
splay(pre,0),splay(suc,pre);
printf("%d\n",mx[son[suc][0]]);
}
void out(int pos)
{
down(pos);
if(son[pos][0]) out(son[pos][0]);
printf("%d ",val[pos]);
if(son[pos][1]) out(son[pos][1]);
}
char type[20];
int main()
{
siz[0]=0,sum[0]=0,lmx[0]=INF,rmx[0]=INF,mx[0]=INF;
int a,b,i,j,stp,len,va;
scanf("%d%d",&a,&b);
tmpn[1]=INF,tmpn[a+2]=INF;
for(i=2;i<=a+1;i++) scanf("%d",&tmpn[i]);
root=build(1,a+2);
fa[root]=0,son[0][1]=root;
for(i=0;i<b;i++)
{
scanf("%s",type);
switch(type[0])
{
case 'I':
{
scanf("%d%d",&stp,&len);
for(j=1;j<=len;j++) scanf("%d",&tmpn[j]);
ins(stp,build(1,len));
break;
}
case 'D':
{
scanf("%d%d",&stp,&len);
del(stp,len);
break;
}
case 'M':
{
if(type[2]=='K')
{
scanf("%d%d%d",&stp,&len,&va);
make_same(stp,len,va);
}
else getmx();
break;
}
case 'R':
{
scanf("%d%d",&stp,&len);
reverse(stp,len);
break;
}
case 'G':
{
scanf("%d%d",&stp,&len);
getsum(stp,len);
break;
}
}
//out(root);
//printf("\n");
}
return 0;
}
回复
共 9 条回复,欢迎继续交流。
正在加载回复...