求助线段树,黄题都不会了/kel
  • 板块P2357 守墓人
  • 楼主ADay
  • 当前回复8
  • 已保存回复8
  • 发布时间2020/8/20 14:39
  • 上次更新2023/11/6 19:51:04
查看原帖
求助线段树,黄题都不会了/kel
312393
ADay楼主2020/8/20 14:39

RT,wtcl

#include<bits/stdc++.h>
using namespace std;
#define rg register
#define il inline
#define cs const
#define sta static
#define i64 long long
#define DEBUG //fprintf(stderr,"PASSED [%s] in LINE %d\n",__FUNCTION__,__LINE__);
namespace io{sta streambuf *inbuf=cin.rdbuf();sta streambuf *outbuf=cout.rdbuf();char buf[1<<21],*p1=buf,*p2=buf;il char gc(){return (p1==p2&&(p2=(p1=buf)+inbuf->sgetn(buf,1<<21),p1==p2)?EOF:*p1++);}il void pc(cs char x){outbuf->sputc(x);}il void ps(cs char *x){outbuf->sputn(x,sizeof(x)),pc(10);}il i64 read(){rg i64 _s=0,_f=1;rg char _ch=gc();for(;!isdigit(_ch);_ch=gc())if(_ch=='-')_f=-1;for(;isdigit(_ch);_ch=gc())_s=_s*10ll+_ch-'0';return _s*_f;}template<typename T>il void write(T _x1){if(_x1<0)pc('-'),_x1=-_x1;sta char _sta[15];int _p=0;do{_sta[_p++]=_x1%10^48;_x1/=10;}while(_x1);while(_p--)pc(_sta[_p]);}string _s;il string readstr(){_s.clear();rg char _ch=gc();while(isspace(_ch))_ch=gc();for(;!isspace(_ch);_ch=gc())_s+=_ch;return _s;}il void writestr(string _s){for(unsigned i=0;i<_s.size();++i)pc(_s[i]);}il void writeln(int _x){write(_x);pc(10);}il void writesp(int _x){write(_x);pc(' ');}}using namespace io;
cs int maxn=2e5+5;
int n,f;
i64 a[maxn<<2],tg[maxn<<2];
il void pushup(int x){a[x]=a[x<<1]+a[x<<1|1];}
il void pushdwon(int x,int l,int r)
{
    if(!tg[x])return;
    int t=tg[x],mid=(l+r)>>1;
    a[x<<1]+=t*(mid-l+1);tg[x<<1]+=t;
    a[x<<1|1]+=t*(r-mid);tg[x<<1|1]+=t;
    tg[x]=0;
}
il void build(int x=1,int l=1,int r=n)
{
    if(l==r)return a[x]=read(),void();
    int mid=(l+r)>>1;
    build(x<<1,l,mid);
    build(x<<1|1,mid+1,r);
    pushup(x);
}
il void upd(cs int s,cs int t,cs int v,int x=1,int l=1,int r=n)
{
    if(s<=l&&r<=t)return a[x]+=v*(r-l+1),tg[x]+=v,void();
    pushdwon(x,l,r);
    int mid=(l+r)>>1;
    if(s<=mid)upd(s,t,v,x<<1,l,mid);
    if(t>mid)upd(s,t,v,x<<1|1,mid+1,r);
    pushup(x);
}
il i64 ask(cs int s,cs int t,int x=1,int l=1,int r=n)
{
    if(s<=l&&r<=t)return a[x];
    int mid=(l+r)>>1;
    i64 res=0;
    if(s<=mid)res+=ask(s,t,x<<1,l,mid);
    if(t>mid)res+=ask(s,t,x<<1|1,mid+1,r);
    return res;
}
int main()
{
    n=read();f=read();
    build();
    while(f--)
    {
        i64 op=read(),l,r,k;
        switch(op)
        {
            case 1:l=read();r=read();k=read();upd(l,r,k);break;
            case 2:k=read();upd(1,1,k);break;
            case 3:k=read();upd(1,1,-k);break;
            case 4:l=read();r=read();writeln(ask(l,r));break;
            case 5:writeln(ask(1,1));break;
        }
    }
    return 0;
}
2020/8/20 14:39
加载中...