2

2021.8.16北高暑训

Day1

早上我们学了线段树入门

支持区间加法和区间查询,相关资料

例题

#include<bits/stdc++.h>
using namespace std;
long long a[4000001],s[4000001],lazy[4000001],ans,n,m,c,c1,c2,c3;
typedef long long ll; 
inline void js(register ll x,register ll l,register ll r)
{
    if(l==r)
    {
        s[x]=a[l];
        return;
    }
    register ll mid=(l+r)>>1;
    js(2*x,l,mid);
    js(2*x+1,mid+1,r);
    s[x]=s[x*2]+s[2*x+1];
}
inline void zd(register ll x,register ll l,register ll r)
{
    register ll mid=(l+r)>>1;
    s[x*2]+=lazy[x]*(mid-l+1);
    s[x*2+1]+=lazy[x]*(r-mid);
    lazy[2*x]+=lazy[x];
    lazy[2*x+1]+=lazy[x];
    lazy[x]=0;
}
inline void xg(register ll x,register ll l,register ll r)
{
    if(r<c1||l>c2)
    {
        return;
    }
    if(lazy[x]!=0)
    {
        zd(x,l,r);
    }
    if(l>=c1&&r<=c2)
    {
        lazy[x]+=c3;
        s[x]+=lazy[x]*(r-l+1);
        return;
    }
    register ll mid=(l+r)>>1;
    xg(2*x,l,mid);
    xg(2*x+1,mid+1,r);
    s[x]=s[x*2]+s[2*x+1];
}
inline void cx(register ll x,register ll l,register ll r)
{
    if(r<c1||l>c2)
    {
        return;
    }
    if(lazy[x]!=0)
    {
        zd(x,l,r);
    }
    if(l>=c1&&r<=c2)
    {
        ans+=s[x];
        return;
    }
    register ll mid=(l+r)>>1;
    cx(2*x,l,mid);
    cx(2*x+1,mid+1,r);
}
int main()
{
    scanf("%lld%d",&n,&m);
    for(register ll i=1;i<=n;++i)
    {
        scanf("%lld",&a[i]);
    }
    js(1,1,n);
    for(register ll i=1;i<=m;++i)
    {
        scanf("%lld",&c);
        if(c==1)
        {
            scanf("%lld%d%d",&c1,&c2,&c3);
            xg(1,1,n);
        }
        if(c==2)
        {
            ans=0;
            scanf("%lld%d",&c1,&c2);
            cx(1,1,n);
            printf("%lld\n",ans);
        }
    }
    return 0;
}

下午,我们写了

NOIP 2016 提高组初赛试题

好难(汗QWQ

特别是那些填空题,只能蒙

不过运气不错,拿了80pets(及格了 骄傲

TM是开森的一天呢

posted @ 2021-08-16 16:46  摩托鸭  阅读(43)  评论(0)    收藏  举报
Live2D