题目描述-->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

差分+树状数组 线段树【P2357】 守墓人相关推荐

  1. D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)

    English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...

  2. P2357 守墓人(树状数组/线段树)

    题目描述 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然..... 因为....守墓人 ...

  3. HDU 1556 前缀和 树状数组 线段树

    解法一: a[i]表示以 i作为起点,对 i-n的气球全部上色的次数  对(start,end)区间上色 ++a[start] --a[end+1]抵消掉 end+1-n的部分 问题转换为求 a的前缀 ...

  4. jzoj3854-分组【树状数组,线段树】

    正题 题目链接:https://jzoj.net/senior/#contest/show/2990/2 题目大意 一个小队满足要求 队长的地位最高 所有队员和队长的年龄差不超过kkk 给出nnn个人 ...

  5. 模板三连击:树状数组+线段树+主席树

    没事儿干,复习模板...... 1.树状数组 本来不想写这个的,但是反正就几分钟就打完了,所以就写了,水AC数. 洛谷 P3374 [模板]树状数组 1 1 #include<cstdio> ...

  6. 51nod 1680区间求和 (dp+树状数组/线段树)

    不妨考虑已知一个区间[l,r]的k=1.k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间) 那么如果加入一个新的数字a[i](i = r+1) 则新区间[l, i]的答案为 ...

  7. CCF201709-5 除法(100分)【树状数组+线段树】

    试题编号: 201709-5 试题名称: 除法 时间限制: 10.0s 内存限制: 256.0MB 问题描述: 问题描述 小葱喜欢除法,所以他给了你N个数a1, a2, ⋯, aN,并且希望你执行M次 ...

  8. POJ2182 HDU2711 Lost Cows【树状数组+线段树】

    Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17113 Accepted: 10664 Descripti ...

  9. [CSP-S模拟测试]:影魔(树状数组+线段树合并)

    题目背景 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万. 千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄. 每一个灵魂,都有着 ...

最新文章

  1. AS升级3.0,gradle plugin 升级到3.0.0遇到的问题
  2. PHP带头大哥谈程序语言的学习体会!
  3. python的GUI之Tkinter的Label组件
  4. 高通骁龙cpu排行_高通骁龙865深度解读:CPU、GPU、内存全新升级
  5. 源码安装NASM,无root权限
  6. E1倒换保护设备知识详解
  7. Python GIL 锁 - Python零基础入门教程
  8. 关于安装TortoiseSVN.msi 报错2203错误
  9. ubuntu18.04安裝搜狗輸入法
  10. RocketMQ源码解析-Broker的HA实现
  11. 10.7 a.m.小结
  12. 视频监控安防平台-国标35114(GB35114)A级检测
  13. 中国地图里暗藏的天机
  14. PTA数组后五道演讲比赛中有10个评委打分(实型数据,十分制分数)一维数组中,然后输入欲删除数x,最后删除数组中值为x的元素并输出,键盘输入一个4×4阶的矩阵,编程输出它的转置矩阵。
  15. BGP 下一跳的理解和实验
  16. Android 10文档阅读总结
  17. html pdf支持css%写法吗,flying-saucer-pdf终于完美解决了(中文问题,换行问题,分页,页眉页脚,水印),html+css控制pdf样式...
  18. MMyolo报错:undefined symbol: _ZN3c105ErrorC2ENS_14SourceLocationESs 的解决方案
  19. 照花台、无锡景、探清水河调
  20. Oracle的安装及导入.dmp文件教程

热门文章

  1. 毕业设计之基于springboot的开源商城系统
  2. 单频阻抗匹配:采用四分之一波长变换器
  3. 慧驱动正弦高频注入FOC学习笔记
  4. 推荐好用的开源 Docker 工具
  5. JavaScript函数
  6. html5/Css3 网页设计 带音乐与食品模块
  7. 摸鱼系列之idea摸鱼插件推荐
  8. “产品设计师”常用软件推荐
  9. 巴菲特卸任后盖茨梅琳达与四位新理事共管盖茨基金会;Club Med中国第三家冰雪度假村开业 | 美通社头条...
  10. 索尼相机照片删除了如何恢复