5月月赛(* ̄︿ ̄)

啊啊啊啊啊我讨厌月赛


第一题:30分

很裸的快速幂,结果考的时候成功的把\(k={10^{10^{9}}}\)看成了\(k^{10^9}\),脑子一抽以为可以用long long
然后就完美的溢出+\(\color {red}{WA}了\)
其实即使看到了我也不会,我忘记了怎么打快速幂了_(:з」∠)_
神奇的快速幂

第二题:20分

20分,我记得我是只写了lis的基本,没写改编得的_(:з」∠)_
我很完美的想到了0的位置完全可以算出前后的大小差距,然后看能用差距补多少个0
然后我不会了
\(\color {lightblue}{艹}\)
后来看std,凑这不是我的想法吗
\(\huge {完了}\),果然是我太蔡了,正解我都想出来了我居然不会写
我觉得挺好的一篇关于lower_bound的解释

第三题

区间查询,第一时间反应就是线段树(啊啊啊啊std就是线段树然而最可怕的是我忘记线段树了我曾经会的啊啊啊)
那.....我贴个我曾经的\(\color {blue}{线段树}\)模板在这里好了_(:з」∠)_

#include<iostream>
#include<cstring>

#define lson (o<<1)
#define rson ((o<<1)|1)

typedef long long ll;

using namespace std;
struct node{
    ll sum;
    ll lazyTag;
}t[400010];
ll n,m;
ll a[400010];

/*void build(int o,int l,int r);
void pushUp(int o);
void pushDown(int o,int l,int r);
void modify(int o,int l,int r,int ql,int qr,int k);
void update(int l,int r,int ql,int qr,int k);
void f(int o,int l,int r,int k);
int query(int o,int l,int r,int ql,int qr);*/
void f(ll o,ll l,ll r,ll k)
{
    t[o].lazyTag+=k;
    t[o].sum+=k*(r-l+1);
}
void pushUp(ll o)
{
    t[o].sum=t[lson].sum+t[rson].sum;//sum
//    cout<<o<<" "<<t[o].sum<<endl;
}

void pushDown(ll o,ll l,ll r)
{
    ll mid=(l+r)>>1;

    f(lson,l,mid,t[o].lazyTag);//左
    f(rson,mid+1,r,t[o].lazyTag);//右

    t[o].lazyTag=0;//标记清零
}

void build(ll o,ll l,ll r)
{
    if(l==r)
    {
        t[o].sum=a[l];
        return;
    }
    ll mid=(l+r)>>1;
    build(lson,l,mid);
    build(rson,mid+1,r);
    pushUp(o);
}


void modify(ll o,ll l,ll r,ll ql,ll qr,ll k)
{
    if(ql<=l&&r<=qr)//如果在区间内
    {
        f(o,l,r,k);
        return;
    }
    pushDown(o,l,r);
    ll mid=(l+r)>>1;
    if(ql<=mid)
        modify(lson,l,mid,ql,qr,k);
    if(mid<qr)
        modify(rson,mid+1,r,ql,qr,k);
    pushUp(o);
}



ll query(ll o,ll l,ll r,ll ql,ll qr)
{
    ll res=0;
    if(ql<=l&&r<=qr)
        return t[o].sum;
    ll mid=(l+r)>>1;
    pushDown(o,l,r);
    if(ql<=mid)
        res+=query(lson,l,mid,ql,qr);
    if(mid<qr)
        res+=query(rson,mid+1,r,ql,qr);
    return res;
}

int main()
{
    cin>>n;
    cin>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    int t;
    ll x,y,k;
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        cin>>t;
        switch(t)
        {
            case 1:
                cin>>x>>y>>k;
                modify(1,1,n,x,y,k);
                break;

            case 2:
                cin>>x>>y;
                cout<<query(1,1,n,x,y)<<endl;
                break;

        }
    }
    return 0;
}

\(\huge {真的完了}\)

posted @ 2019-05-22 17:13  ComputerEngine  阅读(200)  评论(0编辑  收藏  举报