社区讨论
TLE 40pts求助
P2042[NOI2005] 维护数列参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m5z5lq5e
- 此快照首次捕获于
- 2025/01/16 17:54 去年
- 此快照最后确认于
- 2025/11/04 11:30 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m,root=0,a[500005],c[500005],d1[500005],e[500005],l[500005],r[500005],cnt,s[4000005],x,y,z;
bool d2[500005];
string ch;
int newnd()
{
if (s[0])
return s[s[0]--];
else
return ++cnt;
}
struct node
{
int l,r,sum,ans;
} b[500005];
node merge(node x,node y)
{
node result;
result.l=max(x.l,x.sum+y.l);
result.r=max(y.r,x.r+y.sum);
result.sum=x.sum+y.sum;
result.ans=max(max(x.ans,y.ans),x.r+y.l);
return result;
}
void pushup(int x)
{
node nd=(node){a[x],a[x],a[x],a[x]};
if (l[x] && r[x])
b[x]=merge(merge(b[l[x]],nd),b[r[x]]);
else if (l[x])
b[x]=merge(b[l[x]],nd);
else if (r[x])
b[x]=merge(nd,b[r[x]]);
else
b[x]=nd;
c[x]=c[l[x]]+c[r[x]]+1;
}
void pushdown(int x)
{
if (d1[x]!=1001)
{
if (l[x])
{
a[l[x]]=d1[x];
if (d1[x]>0)
b[l[x]]=(node){c[l[x]]*d1[x],c[l[x]]*d1[x],c[l[x]]*d1[x],c[l[x]]*d1[x]};
else
b[l[x]]=(node){d1[x],d1[x],c[l[x]]*d1[x],d1[x]};
d1[l[x]]=d1[x];
}
if (r[x])
{
a[r[x]]=d1[x];
if (d1[x]>0)
b[r[x]]=(node){c[r[x]]*d1[x],c[r[x]]*d1[x],c[r[x]]*d1[x],c[r[x]]*d1[x]};
else
b[r[x]]=(node){d1[x],d1[x],c[r[x]]*d1[x],d1[x]};
d1[r[x]]=d1[x];
}
d1[x]=1001;
}
if (d2[x])
{
if (l[x])
{
swap(b[l[x]].l,b[l[x]].r);
swap(l[l[x]],r[l[x]]);
d2[l[x]]^=1;
}
if (r[x])
{
swap(b[r[x]].l,b[r[x]].r);
swap(l[r[x]],r[r[x]]);
d2[r[x]]^=1;
}
d2[x]=0;
}
}
int merge(int x,int y)
{
if (x && y)
{
if (e[x]<e[y])
{
pushdown(x);
r[x]=merge(r[x],y);
pushup(x);
return x;
}
else
{
pushdown(y);
l[y]=merge(x,l[y]);
pushup(y);
return y;
}
}
else
return x|y;
}
void split(int x,int &y,int &z,int k)
{
if (x)
{
pushdown(x);
if (c[l[x]]<k)
{
y=x;
split(r[x],r[x],z,k-c[l[x]]-1);
}
else
{
z=x;
split(l[x],y,l[x],k);
}
pushup(x);
}
else
{
y=0;
z=0;
}
}
void bianli(int x)
{
if (x)
{
bianli(l[x]);
s[++s[0]]=x;
bianli(r[x]);
}
}
void insert(int num1,int num2)
{
int x,y=newnd(),z;
a[y]=num2;
b[y]=(node){num2,num2,num2,num2};
c[y]=1;
d1[y]=1001;
e[y]=rand();
l[y]=0;
r[y]=0;
split(root,x,z,num1);
root=merge(merge(x,y),z);
}
void erase(int num1,int num2)
{
int x,y,z;
split(root,x,z,num2);
split(x,x,y,num1-1);
bianli(y);
root=merge(x,z);
}
void modify(int num1,int num2,int num3)
{
int x,y,z;
split(root,x,z,num2);
split(x,x,y,num1-1);
a[y]=num3;
if (num3>0)
b[y]=(node){c[y]*num3,c[y]*num3,c[y]*num3,c[y]*num3};
else
b[y]=(node){num3,num3,c[y]*num3,num3};
d1[y]=num3;
root=merge(merge(x,y),z);
}
void reverse(int num1,int num2)
{
int x,y,z;
split(root,x,z,num2);
split(x,x,y,num1-1);
swap(b[y].l,b[y].r);
swap(l[y],r[y]);
d2[y]=1;
root=merge(merge(x,y),z);
}
int query1(int num1,int num2)
{
int x,y,z,result;
split(root,x,z,num2);
split(x,x,y,num1-1);
result=b[y].sum;
root=merge(merge(x,y),z);
return result;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
srand(time(nullptr));
cin>>n>>m;
for (int i=1;i<=n;++i)
{
cin>>a[i];
b[i]=(node){a[i],a[i],a[i],a[i]};
c[i]=1;
d1[i]=1001;
e[i]=rand();
root=merge(root,i);
}
cnt=n;
while (m--)
{
cin>>ch;
if (ch=="INSERT")
{
cin>>x>>y;
while (y--)
{
cin>>z;
insert(x,z);
++x;
}
}
else if (ch=="DELETE")
{
cin>>x>>y;
erase(x,x+y-1);
}
else if (ch=="MAKE-SAME")
{
cin>>x>>y>>z;
modify(x,x+y-1,z);
}
else if (ch=="REVERSE")
{
cin>>x>>y;
reverse(x,x+y-1);
}
else if (ch=="GET-SUM")
{
cin>>x>>y;
cout<<query1(x,x+y-1)<<'\n';
}
else
cout<<b[root].ans<<'\n';
}
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...