2

2021.8.18北高暑训

今天早上我们学习了树状数组(搞不懂为什么我们先学线段树再学树状数组

相关资料

我对于她的lowbit 有些许不理解为什么x&(-x)是在一般情况下,对于 int 型的正数,最高位是 0,接下来是其二进制表示;而对于负数 (-x),表示方法是把 x 按位取反之后再加上 1(不过老师说背就完了

推荐例题

模板1

#include<bits/stdc++.h>
using namespace std;
int n,m,a,c[500001],c3,c1,c2;
inline int lowbit(register int x)
{
    return x&(-x);
}
inline void add(register int x,register int k)
{
    while(x<=n)
    {
        c[x]+=k;
        x+=lowbit(x);
    }
}
inline int getsum(register int x)
{
    register int ans=0;
    while(x!=0)
    {
        ans+=c[x];
        x-=lowbit(x);
    }
    return ans;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(register int i=1;i<=n;++i)
    {
        scanf("%d",&a);
        add(i,a);
    }
    while(m--)
    {
        scanf("%d%d%d",&c3,&c1,&c2);
        if(c3==1)
        {
            add(c1,c2);
        }
        if(c3==2)
        {
            printf("%d\n",getsum(c2)-getsum(c1-1));
        }
    }
    return 0;
}

模板2

#include<bits/stdc++.h>
using namespace std;
int n,m,a,c[500001],ch,c1,c2,k;
inline int lowbit(register int x)
{
    return x&(-x);
}
inline void add(register int x,register int k)
{
    while(x<=n)
    {
        c[x]+=k;
        x+=lowbit(x);
    }
}
inline int getsum(register int x)
{
    register int ans=0;
    while(x!=0)
    {
        ans+=c[x];
        x-=lowbit(x);
    }
    return ans;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(register int i=1;i<=n;++i)
    {
        scanf("%d",&a);
        add(i,a);
    }
    while(m--)
    {
        scanf("%d",&ch);
        if(ch==1)
        {
            scanf("%d%d%d",&c1,&c2,&k);
            add(c1,k);
            add(c2+1,-k);
        }
        if(ch==2)
        {
            scanf("%d",&c1);
            printf("%d\n",getsum(c1)/2);
        }
    }
    return 0;
}

下午我们照常做了一套初赛题

拿了79pats(马 乔  亻敖[doge]

感觉这次的题程序完善不是很难但是理论题我错了挺多(真就理论题和程序实现题我都不会呗

网上的答案解析

今天又TM是开森的一天呢!

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