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]线段树练习的更多相关文章

  1. [tem]线段树(白书版)

    个人感觉有点坑 add用的标记永久化 set用的标记下传 #include <iostream> #include <cstdio> #include <algorith ...

  2. HDU 3911 Black And White(线段树区间合并+lazy操作)

    开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...

  3. CodeForces 19D Points(线段树+map)

    开始想不通,后来看网上说是set,就有一个想法是对每个x建一个set...然后又想直接建立两重的set就好,最后发现不行,自己想多了...  题意是给你三种操作:add (x y) 平面添加(x y) ...

  4. hdu 3333 Turing Tree(线段树+离散化)

    刚看到是3xian大牛的题就让我菊花一紧,觉着这题肯定各种高端大气上档次,结果果然没让我失望. 刚开始我以为是一个普通的线段树区间求和,然后啪啪啪代码敲完测试没通过,才注意到这个求和是要去掉相同的值的 ...

  5. 【ZJOI2016】线段树

    [ZJOI2016]线段树 ZJOI的题神啊. 我们考虑计算每个位置\(p\),它在操作过后变成第\(x\)个数的操作序列数. 我们枚举\(x\).我们先得到了\(L_x,R_x\)表示最左边比\(x ...

  6. 线段树(I tree)

    Codeforces Round #254 (Div. 2)E题这题说的是给了一个一段连续的区间每个区间有一种颜色然后一个彩笔从L画到R每个区间的颜色都发生了 改变然后 在L和R这部分区间里所用的颜色 ...

  7. zoj 3888 Twelves Monkeys 二分+线段树维护次小值

    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemCode=3888 Twelves Monkeys Time Limit: 5 ...

  8. POJ 3368 Frequent values 线段树与RMQ解法

    题意:给出n个数的非递减序列,进行q次查询.每次查询给出两个数a,b,求出第a个数到第b个数之间数字的最大频数. 如序列:-1 -1 1 1 1 1 2 2 3 第2个数到第5个数之间出现次数最多的是 ...

  9. codechef FIBTREE 码农题 线段树 树剖 标记永久化

    好烦啊,调了半天 线段树部分标记比较多,手抖打错了一个 剩下的都是取模的问题 我自己瞎jb推的公式里保留了abs,但是在模意义下是gg的,所以必须把正负区分开 调试的时候一定要注意构造各种形状的树,不 ...

随机推荐

  1. C#代码精确到毫秒时间戳写法

                 TimeSpan ts = new TimeSpan(DateTime.Now.Ticks);            ts.TotalMilliseconds;  

  2. JQuery 快速入门

    1.要学习Jquery @首先要在需要的页面引入 <script type="text/javascript" src="jquery.js">&l ...

  3. linux下 nginx、php-fpm、mysql 开机自启动

    1.分别为每个编写shell脚本放入/etc/init.d下,添加service服务 2.把每个service服务加入到chkconfig列表 这里我们以php-fpm为例说明下步骤: php-fpm ...

  4. Linux命令详解之—tail命令

    tail命令也是一个非常常用的文件查看类的命令,今天就为大家介绍下Linux tail命令的用法. 更多Linux命令详情请看:Linux命令速查手册 Linux tail命令主要用来从指定点开始将文 ...

  5. 【系统架构】缓存Memcache 使用原子性操作add,实现并发锁

    原文地址 memcache中Memcache::add()方法在缓存服务器之前不存在key时, 以key作为key存储一个变量var到缓存服务器.我们使用add来向服务器添加一个键值对应,如果成功则添 ...

  6. Tomcat启动报错整理

    1.启动报 Connector attribute SSLCertificateFile must be defined when using SSL with APR conf\server.xml ...

  7. 为什么你不应该使用 MongoDB

    本文转载自: http://www.oschina.net/translate/why-you-should-never-use-mongodb (只作转载, 不代表本站和博主同意文中观点或证实文中信 ...

  8. 网站banner无缝轮播

    网站banner无缝轮播 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  9. iOS UINavigationController的使用

    NavigationController,又称导航控制器.是iOS开发中比较常用的一种容器ViewController,常用于页面的管理和切换. 在开发中,NavigationController常常 ...

  10. [转]Design Pattern Interview Questions - Part 1

    Factory, Abstract factory, prototype pattern (B) What are design patterns? (A) Can you explain facto ...