社区讨论
求调
学术版参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lyz2b0z7
- 此快照首次捕获于
- 2024/07/24 07:43 2 年前
- 此快照最后确认于
- 2024/07/24 09:25 2 年前
CPP
#include<stdio.h>
#include<bits/stdc++.h>
#define N 100010
#define MOD 998244353
#define esp 1e-8
#define INF 999999999999999999
#define LL long long
#define rep(i,a,b,g) for(LL i=a;i<=b;i+=g)
#define rem(i,a,b,g) for(LL i=a;i>=b;i-=g)
#define repn(i,a,b,g) for(LL i=a;i<b;i+=g)
#define remn(i,a,b,g) for(LL i=a;i>b;i-=g)
#define pll pair<LL,LL>
#define mkp(x,y) make_pair(x,y)
#define i128 __int128
#define lowbit(x) ((x)&(-(x)))
#define lc (u<<1)
#define rc (u<<1|1)
using namespace std;
void read(i128 &x)
{
i128 f=1;
x=0;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
x*=f;
}
void writing(i128 x)
{
if(x>=10)writing(x/10);
putchar(x%10+'0');
}
void write(i128 x)
{
if(x<0)
{
putchar('-');
x=-x;
}
writing(x);
}
LL n,m,a[N],cg[N];
struct nod
{
LL mcs,mcb,v;
}t[N<<2];
void pu(LL u,LL l,LL r)
{
t[u].mcs=min(t[lc].mcs,t[rc].mcs)+cg[u];
t[u].mcb=max(t[lc].mcb,t[rc].mcb)+cg[u];
t[u].v=t[lc].v+t[rc].v+(r-l+1)*cg[u];
}
void bu(LL u,LL l,LL r)
{
if(l==r)
{
t[u].mcb=t[u].mcs=t[u].v=a[l];
return;
}
LL mid=l+r>>1;
bu(lc,l,mid);
bu(rc,mid+1,r);
pu(u,l,r);
}
void sq(LL u,LL l,LL r,LL x,LL y,LL tg)
{
if(x>r||y<l)return;
if(x<=l&&r<=y)
{
if((t[u].mcs==t[u].mcb)||((t[u].mcb-t[u].mcs==1)&&(sqrt(t[u].mcb+tg))==sqrt(t[u].mcs+tg)+1))
{
LL tmp=sqrt(t[u].mcb+tg);
tmp-=t[u].mcb+tg;
t[u].v+=(r-l+1)*tmp;
cg[u]+=tmp;
t[u].mcb+=tmp;
t[u].mcs+=tmp;
return;
}
}
LL mid=l+r>>1;
sq(lc,l,mid,x,y,tg+cg[u]);
sq(rc,mid+1,r,x,y,tg+cg[u]);
pu(u,l,r);
}
void ud(LL u,LL l,LL r,LL x,LL y,LL k)
{
if(x>r||y<l)return;
if(x<=l&&r<=y)
{
t[u].mcb+=k;
t[u].mcs+=k;
t[u].v+=k*(r-l+1);
cg[u]+=k;
return;
}
LL mid=l+r>>1;
ud(lc,l,mid,x,y,k);
ud(rc,mid+1,r,x,y,k);
pu(u,l,r);
}
LL q(LL u,LL l,LL r,LL x,LL y,LL tg)
{
if(x>r||y<l)return 0;
if(x<=l&&r<=y)return t[u].v+(r-l+1)*tg;
LL mid=l+r>>1;
return q(lc,l,mid,x,y,tg+cg[u])+q(rc,mid+1,r,x,y,tg+cg[u]);
}
int main()
{
cin>>n>>m;
rep(i,1,n,1)cin>>a[i];
bu(1,1,n);
rep(i,1,m,1)
{
LL op,l,r,x;
cin>>op>>l>>r;
if(op==1)
{
cin>>x;
ud(1,1,n,l,r,x);
}
if(op==2)
{
sq(1,1,n,l,r,0);
}
if(op==3)
{
cout<<q(1,1,n,l,r,0)<<endl;
}
}
return 0;
}

RE。
样例能过。
回复
共 2 条回复,欢迎继续交流。
正在加载回复...