[tem]线段树练习
1080 线段树练习
单点修改,区间查询和
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define m ((l+r)>>1)
#define lson o<<1,l,m
#define rson o<<1|1,m+1,r
#define lc o<<1
#define rc o<<1|1
using namespace std;
typedef long long ll;
const int N=1e5+,INF=1e9+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,a[N],M,op,x,y;
int t[N<<];
void build(int o,int l,int r){
if(l==r) t[o]=a[l];
else{
build(lson);
build(rson);
t[o]=t[lc]+t[rc];
}
}
void add(int o,int l,int r,int p,int v){
if(l==r) t[o]+=v;
else{
if(p<=m) add(lson,p,v);
else add(rson,p,v);
t[o]=t[lc]+t[rc];
}
}
int query(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return t[o];
else{
int ans=;
if(ql<=m) ans+=query(lson,ql,qr);
if(qr>m) ans+=query(rson,ql,qr);
return ans;
}
}
int main(int argc, const char * argv[]) {
n=read();
for(int i=;i<=n;i++) a[i]=read();
build(,,n);
M=read();
for(int i=;i<=M;i++){
op=read();x=read();y=read();
if(op==){add(,,n,x,y);}
else {printf("%d\n",query(,,n,x,y));}
}
return ;
}
PS:树状数组
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=1e5+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,Q,a[N],c[N],flag,l,r,x;
inline int lowbit(int x){return x&-x;}
void build(int n){
for(int i=;i<=n;i++){
c[i]+=a[i];
if(i+lowbit(i)<=n)
c[i+lowbit(i)]+=c[i];
}
}
void add(int x,int d){
for(int i=x;i<=n;i+=lowbit(i)) c[i]+=d;
}
int sum(int x){
int res=;
for(int i=x;i>;i-=lowbit(i)) res+=c[i];
return res;
}
int main(int argc, const char * argv[]) {
n=read();
for(int i=;i<=n;i++) a[i]=read();
build(n);
Q=read();
for(int i=;i<=Q;i++){
flag=read();
if(flag==){
l=read();x=read();add(l,x);
}else{
l=read();r=read();
printf("%d\n",sum(r)-sum(l-));
}
}
return ;
}
1082 线段树练习 3
区间修改,区间查询和
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define m (l+r)/2
#define lson o<<1,l,m
#define rson o<<1|1,m+1,r
#define lc o<<1
#define rc o<<1|1
using namespace std;
typedef long long ll;
const int N=2e5+,INF=1e9+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
struct node{
ll lazy,x;
}t[N<<];
int a[N];
void build(int o,int l,int r){
if(l==r) t[o].x=a[l];
else{
build(lson);
build(rson);
t[o].x=t[lc].x+t[rc].x;
}
}
void paint(int o,int l,int r,ll delta){
t[o].lazy+=delta;
t[o].x+=delta*(r-l+);
}
void pushDown(int o,int l,int r){
paint(lson,t[o].lazy);
paint(rson,t[o].lazy);
t[o].lazy=;
}
void add(int o,int l,int r,int ql,int qr,ll v){
if(ql<=l&&r<=qr) paint(o,l,r,v);
else{
pushDown(o,l,r);
if(ql<=m) add(lson,ql,qr,v);
if(m<qr) add(rson,ql,qr,v);
t[o].x=t[lc].x+t[rc].x;
}
}
ll query(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return t[o].x;
else{
pushDown(o,l,r);
ll ans=;
if(ql<=m) ans+=query(lson,ql,qr);
if(m<qr) ans+=query(rson,ql,qr);
return ans;
}
}
int n,Q,flag,l,r,x;
int main(){
n=read();
for(int i=;i<=n;i++) a[i]=read();
build(,,n);
Q=read();
for(int i=;i<=Q;i++){
flag=read();
if(flag==){
l=read();r=read();x=read();
add(,,n,l,r,x);
}else{
l=read();r=read();
printf("%lld\n",query(,,n,l,r));
}
}
}
[tem]线段树练习的更多相关文章
- [tem]线段树(白书版)
个人感觉有点坑 add用的标记永久化 set用的标记下传 #include <iostream> #include <cstdio> #include <algorith ...
- HDU 3911 Black And White(线段树区间合并+lazy操作)
开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...
- CodeForces 19D Points(线段树+map)
开始想不通,后来看网上说是set,就有一个想法是对每个x建一个set...然后又想直接建立两重的set就好,最后发现不行,自己想多了... 题意是给你三种操作:add (x y) 平面添加(x y) ...
- hdu 3333 Turing Tree(线段树+离散化)
刚看到是3xian大牛的题就让我菊花一紧,觉着这题肯定各种高端大气上档次,结果果然没让我失望. 刚开始我以为是一个普通的线段树区间求和,然后啪啪啪代码敲完测试没通过,才注意到这个求和是要去掉相同的值的 ...
- 【ZJOI2016】线段树
[ZJOI2016]线段树 ZJOI的题神啊. 我们考虑计算每个位置\(p\),它在操作过后变成第\(x\)个数的操作序列数. 我们枚举\(x\).我们先得到了\(L_x,R_x\)表示最左边比\(x ...
- 线段树(I tree)
Codeforces Round #254 (Div. 2)E题这题说的是给了一个一段连续的区间每个区间有一种颜色然后一个彩笔从L画到R每个区间的颜色都发生了 改变然后 在L和R这部分区间里所用的颜色 ...
- zoj 3888 Twelves Monkeys 二分+线段树维护次小值
链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemCode=3888 Twelves Monkeys Time Limit: 5 ...
- POJ 3368 Frequent values 线段树与RMQ解法
题意:给出n个数的非递减序列,进行q次查询.每次查询给出两个数a,b,求出第a个数到第b个数之间数字的最大频数. 如序列:-1 -1 1 1 1 1 2 2 3 第2个数到第5个数之间出现次数最多的是 ...
- codechef FIBTREE 码农题 线段树 树剖 标记永久化
好烦啊,调了半天 线段树部分标记比较多,手抖打错了一个 剩下的都是取模的问题 我自己瞎jb推的公式里保留了abs,但是在模意义下是gg的,所以必须把正负区分开 调试的时候一定要注意构造各种形状的树,不 ...
随机推荐
- 【C#公共帮助类】ZipHelper 压缩和解压帮助类,经过实战总结出来的代码
关于本文档的说明 本文档基于ICSharpCode.SharpZipLib.dll的封装,常用的解压和压缩方法都已经涵盖在内,都是经过项目实战积累下来的 欢迎传播分享,必须保持原作者的信息,但禁止将该 ...
- 使用js批量选中功能实现更改数据库中的status状态值(批量展示)
我们在开发项目的时候经常会在后台管理时用到批量展示功能来动态的修改数据库的值.下面以修改数据库的status状态值来实现批量展示功能.批量选中功能引用js来实现.前端html代码: <table ...
- MyBatis的mapper
在前面的学习中,我们还在写一些接口啊,实现类啊,是不是感觉好low的... 其实,我们是可以不用写接口的实现类的,今天就带着大家一起学习一下,当然,我是回顾的. 看下面的结构,是不是没实现类呢! 源码 ...
- hadoop 集群的配置
在经过几天折腾,终于将hadoop环境搭建成功,整个过程中遇到各种坑,反复了很多遍,光虚拟机就重新安装了4.5次,接下来就把搭建的过程详细叙述一下 0.相关工具: 1,系统环境说明: 我这边给出我的集 ...
- jquery根据name属性查找
$("div[id]") 选择所有含有id属性的div元素 $("input[name='keleyicom']") 选择所有的name属性等于'keleyic ...
- 【IScroll深入学习】突破移动端黑暗的利器(上)
前言 在去年,我们对IScroll的源码进行了学习,并且分离出了一段代码自己使用,在使用学习过程中发现几个致命问题: ① 光标移位 ② 文本框找不到(先让文本框获取焦点,再滑动一下,输入文字便可重现) ...
- css(一)
CSS CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. 一 css的四种引入方式 1.行内式 ...
- iOS tableView右滑显示选择
如何使用UITableViewRowAction实现右滑选择呢? 1.在iOS8以前,我们实现tableview中滑动显示删除,置顶,更多等等的按钮时,都需要自己去实现,在iOS8中系统已经写好了,只 ...
- Activity详解一 配置、启动和关闭activity
先看效果图: Android为我们提供了四种应组件,分别为Activity.Service.Broadcast receivers和Content providers,这些组建也就是我们开发一个And ...
- spring-boot 热部署 intellij IDE
1.使用springloadded插件: 如何使用: a.先在ide里面部署好你的service,( mvn spring-boot:run) b.修改代码, c.command+F9(或build- ...