社区讨论
样例过但全MLE求调
P5350序列参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @m60g1j0p
- 此快照首次捕获于
- 2025/01/17 15:34 去年
- 此快照最后确认于
- 2025/11/04 11:27 4 个月前
rt和第一篇题解思路一样
CPP#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
int n,m,root,a[4000005],b[4000005],c[4000005],d1[4000005],d2[4000005],e[4000005],l[4000005],r[4000005],cnt=0,k,x,y,z,zz,p[300005];
bool d3[4000005];
int copy(int x)
{
a[++cnt]=a[x];
b[cnt]=b[x];
c[cnt]=c[x];
d1[cnt]=d1[x];
d2[cnt]=d2[x];
d3[cnt]=d3[x];
e[cnt]=e[x];
l[cnt]=l[x];
r[cnt]=r[x];
return cnt;
}
void pushup(int x)
{
b[x]=(a[x]+(b[l[x]]+b[r[x]])%mod)%mod;
c[x]=c[l[x]]+c[r[x]]+1;
}
void modify1(int x,int y)
{
a[x]=y;
b[x]=(long long)c[x]*y%mod;
d1[x]=y;
d2[x]=0;
}
void modify2(int x,int y)
{
a[x]=(a[x]+y)%mod;
b[x]=(b[x]+(long long)c[x]*y%mod)%mod;
d2[x]=(d2[x]+y)%mod;
}
void modify3(int x)
{
swap(l[x],r[x]);
d3[x]^=1;
}
void pushdown(int x)
{
if (d1[x]!=-1 || d2[x] || d3[x])
{
if (l[x])
{
l[x]=copy(l[x]);
if (d1[x]!=-1)
modify1(l[x],d1[x]);
modify2(l[x],d2[x]);
if (d3[x])
modify3(l[x]);
}
if (r[x])
{
r[x]=copy(r[x]);
if (d1[x]!=-1)
modify1(r[x],d1[x]);
modify2(r[x],d2[x]);
if (d3[x])
modify3(r[x]);
}
d1[x]=-1;
d2[x]=0;
d3[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);
x=copy(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;
}
}
int build(int ll,int rr)
{
if (ll<=rr)
{
int x=++cnt,mid=ll+rr>>1;
a[x]=p[mid];
b[x]=a[x];
c[x]=1;
d1[x]=-1;
d2[x]=0;
d3[x]=0;
e[x]=rand();
l[x]=build(ll,mid-1);
r[x]=build(mid+1,rr);
pushup(x);
return x;
}
else
return 0;
}
int query(int num1,int num2)
{
int x,y,z,result;
split(root,x,z,num2);
split(x,x,y,num1-1);
result=b[y];
root=merge(merge(x,y),z);
return result;
}
void cover(int num1,int num2,int num3)
{
int x,y,z;
split(root,x,z,num2);
split(x,x,y,num1-1);
modify1(y,num3);
root=merge(merge(x,y),z);
}
void add(int num1,int num2,int num3)
{
int x,y,z;
split(root,x,z,num2);
split(x,x,y,num1-1);
modify2(y,num3);
root=merge(merge(x,y),z);
}
void fuzhi(int num1,int num2,int num3,int num4)
{
int x,xx,y,zz,z;
bool sb=0;
if (num1>num3)
{
swap(num1,num3);
sb=1;
}
if (num2>num4)
swap(num2,num4);
split(root,zz,z,num4);
split(zz,y,zz,num3-1);
split(y,xx,y,num2);
split(xx,x,xx,num1-1);
if (sb)
xx=copy(zz);
else
zz=copy(xx);
root=merge(merge(merge(x,zz),y),merge(xx,z));
}
void jiaohuan(int num1,int num2,int num3,int num4)
{
int x,xx,y,zz,z;
if (num1>num3)
swap(num1,num3);
if (num2>num4)
swap(num2,num4);
split(root,zz,z,num4);
split(zz,y,zz,num3-1);
split(y,xx,y,num2);
split(xx,x,xx,num1-1);
root=merge(merge(merge(x,zz),y),merge(xx,z));
}
void reverse(int num1,int num2)
{
int x,y,z;
split(root,x,z,num2);
split(x,x,y,num1-1);
modify3(y);
root=merge(merge(x,y),z);
}
void dfs(int x)
{
if (x)
{
pushdown(x);
dfs(l[x]);
p[++n]=a[x];
dfs(r[x]);
}
}
void print(int x)
{
if (x)
{
pushdown(x);
print(l[x]);
cout<<a[x]<<' ';
print(r[x]);
}
}
int main()
{
srand(time(nullptr));
cin>>n>>m;
for (int i=1;i<=n;++i)
scanf("%d",&p[i]);
root=build(1,n);
for (int i=1;i<=m;++i)
{
scanf("%d",&k);
if (k==1)
{
scanf("%d%d",&x,&y);
cout<<query(x,y)<<'\n';
}
else if (k==2)
{
scanf("%d%d%d",&x,&y,&z);
cover(x,y,z);
}
else if (k==3)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
else if (k==4)
{
scanf("%d%d%d%d",&x,&y,&z,&zz);
fuzhi(x,y,z,zz);
}
else if (k==5)
{
scanf("%d%d%d%d",&x,&y,&z,&zz);
jiaohuan(x,y,z,zz);
}
else
{
scanf("%d%d",&x,&y);
reverse(x,y);
}
if (cnt>3600000)
{
n=0;
dfs(root);
cnt=0;
root=build(1,n);
}
}
print(root);
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...