Mn Zn 不知道哪里错了(
查看原帖
Mn Zn 不知道哪里错了(
407417
HerikoDeltana楼主2021/6/13 17:15

线段树做法,RT。

感谢各位大佬(

#include <bits/stdc++.h>
#define Heriko return
#define Deltana 0
#define S signed
#define LL long long
#define R register
#define I inline
#define lc(x) (x<<1)
#define rc(x) (x<<1|1)
#define CI const int
#define mst(a, b) memset(a, b, sizeof(a))
#define ON std::ios::sync_with_stdio(false)
using namespace std;
I void fr(LL & x)
{
    LL f=1;
    char c=getchar();
    x=0;
    while(c<'0' or c>'9')
    {
        if(c=='-') f=-1;
        c=getchar();
    }
    while (c>='0' and c<='9') 
    {
        x=(x<<3)+(x<<1)+c-'0';
        c=getchar();
    }
    x*=f;
}
I void fw(LL x)
{
    if(x<0) putchar('-'),x=-x;
    static LL stak[35];
    LL top=0;
    do
    {
        stak[top++]=x%10;
        x/=10;
    }
    while(x);
    while(top) putchar(stak[--top]+'0');
    putchar('\n');
}
CI MXX=5e6+5;
LL n,m;
struct node
{
    LL val,add;
}
t[MXX];
I void pushup(LL x)
{
    t[x].val=t[lc(x)].val+t[rc(x)].val;
}
void build(LL x,LL l,LL r)
{
    t[x].add=0;
    if(l==r) {fr(t[x].val);Heriko;}
    LL mid=(l+r)>>1;
    build(lc(x),l,mid);
    build(lc(x),mid+1,r);
    pushup(x);
}
I void pushdown(LL x,LL l)
{
    t[lc(x)].val=t[lc(x)].val+t[x].add*(l-(l>>1));
    t[rc(x)].val=t[rc(x)].val+t[x].add*(l>>1);
    t[lc(x)].add+=t[x].add;
    t[rc(x)].add+=t[x].add;
    t[x].add=0;
}
void add(LL rt,LL l,LL r,LL x,LL y,LL val)
{
    if(x<=l and r<=y)
    {
        t[rt].add+=val;
        t[rt].val+=val*(r-l+1);
        Heriko;
    }
    pushdown(rt,r-l+1);
    LL mid=(l+r)>>1;
    if(x<=mid) add(lc(rt),l,mid,x,y,val);
    if(y>mid) add(rc(rt),mid+1,r,x,y,val);
    pushup(rt);
}
LL query(LL rt,LL l,LL r,LL x,LL y)
{
    if(x<=l and r<=y) Heriko t[rt].val;
    LL mid=(l+r)>>1,ans=0;
    if(x<=mid) ans+=query(lc(rt),l,mid,x,y);
    if(y>mid) ans+=query(rc(rt),mid+1,r,x,y);
    Heriko ans;
}
LL a,b,c,d;
S main()
{
    fr(n),fr(m);
    build(1,1,n);
    while(m--)
    {
        fr(a);
        if(a==1) fr(b),fr(c),fr(d),add(1,1,n,b,c,d);
        else if(a==2) fr(b),add(1,1,n,1,1,b);
        else if(a==3) fr(b),add(1,1,n,1,1,-b);
        else if(a==4) fr(b),fr(c),fw(query(1,1,n,b,c));
        else fw(query(1,1,n,1,1));
    }
    Heriko Deltana;
}
2021/6/13 17:15
加载中...