[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的,所以必须把正负区分开 调试的时候一定要注意构造各种形状的树,不 ...
随机推荐
- SharePoint创建web application出现“The password supplied with the username was not correct”错误的解决方法
平台环境 Windows Server 2012 R2 Standard, SharePoint Server 2010, Microsoft SQL Server 2012 (SP1) 问题描述 在 ...
- 深入理解JDK中的I/O
深入理解JDK中的I/O 目 录 java内存模型GCHTTP协议事务隔离级并发多线程设计模式清楚redis.memcache并且知道区别mysql分表分库有接口幂等性了解jdk8稍微了解一下特性 j ...
- python基础之数据类型(一)
Python3 数字(Number) 定义:a=1 特性: 1.只能存放一个值 2.一经定义,不可更改 3.直接访问 分类:整型,长整型,布尔,浮点,复数 python2.*与python3.*关于整 ...
- JavaScript实现通过的集合类
集合是一种数据结构,用以表示非重复值的无序集合.集合的基础方法包括添加值.检测值是否在集合中,这种集合需要一种通用的实现,以保证操作效率. JavaScript的对象是属性名以及与之对应的值的基本集合 ...
- Event 8306 5021 5059 5057发布安全令牌时异常
现象:站点访问一个,应用程序池就自动停掉一个 日志报错 解决: 1.受域策略影响,作为批处理作业登录选项被锁定,需修改域策略: 更新后: 2.确保程序池账户倒在IIS_IUSER组 ...
- 在其他系统Iframe中显示SharePoint 页面
前段时间在做一个项目,要求将SharePoint 的 OWA(Office Web Apps)中的文档显示页面嵌入到另外一个OA系统中,提供给用户可以通过浏览器查看SharePoint文档的能力. 嵌 ...
- iOS项目groups和folder的区别(组和文件夹)
在引用一个第三方框架的时候,已经拖进去了,但是引用框架里面的文件时,竟然报错说找不到.......查了一下,原来在拖进去时没有注意group和folder的选择! 其实仔细观察一下,不难发现,以gro ...
- Android编码规范02
同一项目开发过程中需要所有开发人员都有一种风格,做Android项目就要统一遵从Android代码风格: 要想了解Android的代码风格,最好的方式就是查看Android源代码: 下载Android ...
- 初学HTML 常见的标签(三) 插入类标签
第三篇博客, 这次说的是插入链接类标签, 我们平常在网页中经常能看到蓝色的链接类标签, 或者是一张图片, 一个电邮, 这些都是插入链接类的标签起的作用. <a></a>链接标签 ...
- Android measure过程分析
作为一名Android开发人员,我们都知道一个View从无到有,会经历3个阶段: 1. measure/测量阶段,也就是确定某个view大小的过程: 2. layout/布局阶段,也就是确定其左上右下 ...