社区讨论

求调

学术版参与者 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 条回复,欢迎继续交流。

正在加载回复...