差分+树状数组 线段树【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
差分+树状数组 线段树【P2357】 守墓人相关推荐
- D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)
English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...
- P2357 守墓人(树状数组/线段树)
题目描述 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然..... 因为....守墓人 ...
- HDU 1556 前缀和 树状数组 线段树
解法一: a[i]表示以 i作为起点,对 i-n的气球全部上色的次数 对(start,end)区间上色 ++a[start] --a[end+1]抵消掉 end+1-n的部分 问题转换为求 a的前缀 ...
- jzoj3854-分组【树状数组,线段树】
正题 题目链接:https://jzoj.net/senior/#contest/show/2990/2 题目大意 一个小队满足要求 队长的地位最高 所有队员和队长的年龄差不超过kkk 给出nnn个人 ...
- 模板三连击:树状数组+线段树+主席树
没事儿干,复习模板...... 1.树状数组 本来不想写这个的,但是反正就几分钟就打完了,所以就写了,水AC数. 洛谷 P3374 [模板]树状数组 1 1 #include<cstdio> ...
- 51nod 1680区间求和 (dp+树状数组/线段树)
不妨考虑已知一个区间[l,r]的k=1.k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间) 那么如果加入一个新的数字a[i](i = r+1) 则新区间[l, i]的答案为 ...
- CCF201709-5 除法(100分)【树状数组+线段树】
试题编号: 201709-5 试题名称: 除法 时间限制: 10.0s 内存限制: 256.0MB 问题描述: 问题描述 小葱喜欢除法,所以他给了你N个数a1, a2, ⋯, aN,并且希望你执行M次 ...
- POJ2182 HDU2711 Lost Cows【树状数组+线段树】
Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17113 Accepted: 10664 Descripti ...
- [CSP-S模拟测试]:影魔(树状数组+线段树合并)
题目背景 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万. 千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄. 每一个灵魂,都有着 ...
最新文章
- AS升级3.0,gradle plugin 升级到3.0.0遇到的问题
- PHP带头大哥谈程序语言的学习体会!
- python的GUI之Tkinter的Label组件
- 高通骁龙cpu排行_高通骁龙865深度解读:CPU、GPU、内存全新升级
- 源码安装NASM,无root权限
- E1倒换保护设备知识详解
- Python GIL 锁 - Python零基础入门教程
- 关于安装TortoiseSVN.msi 报错2203错误
- ubuntu18.04安裝搜狗輸入法
- RocketMQ源码解析-Broker的HA实现
- 10.7 a.m.小结
- 视频监控安防平台-国标35114(GB35114)A级检测
- 中国地图里暗藏的天机
- PTA数组后五道演讲比赛中有10个评委打分(实型数据,十分制分数)一维数组中,然后输入欲删除数x,最后删除数组中值为x的元素并输出,键盘输入一个4×4阶的矩阵,编程输出它的转置矩阵。
- BGP 下一跳的理解和实验
- Android 10文档阅读总结
- html pdf支持css%写法吗,flying-saucer-pdf终于完美解决了(中文问题,换行问题,分页,页眉页脚,水印),html+css控制pdf样式...
- MMyolo报错:undefined symbol: _ZN3c105ErrorC2ENS_14SourceLocationESs 的解决方案
- 照花台、无锡景、探清水河调
- Oracle的安装及导入.dmp文件教程