P2357 守墓人

题目描述-->p2357 守墓人

敲了一遍线段树,水过.

树状数组分析

主要思路:

差分

简单介绍一下差分(详细概念太麻烦,看下面.

给定一个数组
7 8 6 5 1 8 18 20 35 //瞎敲的emmm
7 1 -2 -1 3 10 2  15//对应得到差分数组.
我们发现从[1,i]求和,得到的就是我们的原数组对应值.(这就是差分.

为什么用差分+树状数组?

对应差分,我们修改一个位置都会对应影响一段区间.

差分的话,我们修改一个位置就达到了修改后面区间的效果.

而我们修改一个区间,只需要对于左端点增加k,右端点+1位置减去k即可.

对应差分操作,区间修改操作,我们可以推导出下面的式子.

图片来源-->@胡小兔

学习一下(简单了解)就可以了.

所以我们就可以很简单码出来.

码量小又简单,树状数组你值得拥有

安利一篇很好的写树状数组的blog

--------------------代码---------------------

/*
目前树状数组解法rank1(吸氧
Timeuse:214ms
Creator:顾z
Date:2018.09.07
*/
#include<bits/stdc++.h>
#define int long long
#define IL inline
#define RI register int
#define lowbit(x) x&-x
IL void in(int &x){
    int f=1;x=0;char s=getchar();
    while(s>‘9‘||s<‘0‘){if(s==‘-‘)f=-1;s=getchar();}
    while(s<=‘9‘&&s>=‘0‘){x=x*10+s-‘0‘;s=getchar();}
    x*=f;
}
int n,m,last,opt,x,y,z,mian;
int sum1[500002],sum2[500002];
IL void add(int pos,int x)
{
    for(RI i=pos;i<=n;i+=lowbit(i))
        sum1[i]+=x,sum2[i]+=pos*x;
}
IL long long query(int pos)
{
    long long res=0;
    for(RI i=pos;i;i-=lowbit(i))
        res+=(pos+1)*sum1[i]-sum2[i];
    return res;
}
main(void)
{
    in(n),in(m);
    for(RI i=1;i<=n;i++)in(x),add(i,x-last),last=x;
    for(RI i=1,opt;i<=m;i++)
    {
        in(opt);
        switch(opt)
        {
            case 1:in(x),in(y),in(z),add(x,z),add(y+1,-z);break;
            case 2:in(z),mian+=z;break;
            case 3:in(z),mian-=z;break;
            case 4:in(x),in(y);printf("%lld\n",query(y)-query(x-1)+(x==1)*mian);break;
            case 5:printf("%lld\n",query(1)+mian);
        }
    }
}

再粘一下线段树代码 emm↓


/*
线段树就跑的有些慢了 emmm(未吸氧
zkw线段树应该会更快一些.
Timeuse:594ms
Creator:顾z
Date:2018.09.03
*/
#include<bits/stdc++.h>
#define int long long
#define IL inline
#define RI register int
#define ls o<<1
#define rs o<<1|1
#define N 1000008
IL void read(int &x){
    int f=1;x=0;char s=getchar();
    while(s>‘9‘||s<‘0‘){if(s==‘-‘)f=-1;s=getchar();}
    while(s<=‘9‘&&s>=‘0‘){x=x*10+s-‘0‘;s=getchar();}
    x*=f;
}
int n,f,tr[N],tg[N],mian,c[N];
IL void up(int o){tr[o]=tr[ls]+tr[rs];return;}
IL void build(int o,int l,int r)
{
    if(l==r)
    {
        read(tr[o]);
        return;
    }
    int mid=(l+r)>>1;
    build(ls,l,mid);
    build(rs,mid+1,r);
    up(o);
    return;
}
IL void down(int o,int l,int r)
{
    if(tg[o])
    {
        int mid=(l+r)>>1;
        tg[ls]+=tg[o];tg[rs]+=tg[o];
        tr[ls]+=tg[o]*(mid-l+1);
        tr[rs]+=tg[o]*(r-mid);
        tg[o]=0;
    }
}
IL int query(int o,int l,int r,int x,int y)
{
    if(x<=l&&y>=r)return tr[o];
    down(o,l,r);
    int res=0;
    int mid=(l+r)>>1;
    if(x<=mid)res+=query(ls,l,mid,x,y);
    if(y>mid)res+=query(rs,mid+1,r,x,y);
    return res;
}
IL void change(int o,int l,int r,int x,int y,int del)
{
    if(x<=l&&y>=r)
    {
        tg[o]+=del;
        tr[o]+=del*(r-l+1);
        return;
    }
    down(o,l,r);
    int mid=(l+r)>>1;
    if(x<=mid)change(ls,l,mid,x,y,del);
    if(y>mid)change(rs,mid+1,r,x,y,del);
    up(o);
    return;
}
signed main()
{
    read(n),read(f);
    build(1,1,n);
    for(RI i=1,opt,x,y,z;i<=f;i++)
    {
        read(opt);
        switch(opt)
        {
            case 1:read(x),read(y),read(z),change(1,1,n,x,y,z);break;
            case 2:read(z),mian+=z;break;
            case 3:read(z),mian-=z;break;
            case 4:read(x),read(y),printf("%lld\n",query(1,1,n,x,y)+(x==1)*mian);break;
            case 5:printf("%lld\n",query(1,1,n,1,1)+mian);break;
        }
    }
}

目前树状数组解法rank1

原文地址:https://www.cnblogs.com/-guz/p/9612815.html

时间: 2024-10-08 20:47:09

P2357 守墓人的相关文章

[洛谷2357] 守墓人

题目描述 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然..... 因为....守墓人懂风水 0.0 他把墓地分为主要墓碑和次要墓碑, 主要墓碑 只能有 1 个, 守墓人把他记为 1 号, 而次要墓碑有 n-1 个,守墓人将之编号为 2,3...n,所以构成了一个有 n 个墓碑的墓地. 而每个墓碑有一个初始的风水值,这些风水值决定了墓地的风水的好坏,所以守墓人 需要经常来查询这些墓碑

抗日名将粟裕

由中国文史出版社出版的<抗日名将粟裕>一书,是一位基层且普通的自诩为“革命先烈的守墓人”——何苏平所创作.该书稿采用章回小说的手法,从粟裕受命担任抗日先遣队参谋长至力主对日最后一战,共四十个章回,较全面地叙述了粟裕在整个抗日战争时期的政治.军事活动和杰出贡献,以及高超的军事指挥才能,是一部融历史性.知识性和可读性于一体的作品.笔者读后,为之振奋,为之鼓舞,为之感慨:为该书史实准确.资料可信.文字简练叫好!更为该书以大量鲜为人知的事实诠释粟裕将军为何被日军尊为“天神”而叫绝! 全书翔实地展示了粟

图书-科幻:《三体》

ylbtech-图书-科幻:<三体> <三体>是刘慈欣创作的系列长篇科幻小说,由<三体>.<三体Ⅱ·黑暗森林>.<三体Ⅲ·死神永生>组成,第一部于2006年5月起在<科幻世界>杂志上连载,第二部于2008年5月首次出版,第三部则于2010年11月出版. 作品讲述了地球人类文明和三体文明的信息交流.生死搏杀及两个文明在宇宙中的兴衰历程.其第一部经过刘宇昆翻译后获得了第73届雨果奖最佳长篇小说奖. 2019年9月23日,该小说入选“新中国