T1081 线段树练习 2 codevs
http://codevs.cn/problem/1081/
给你N个数,有两种操作
1:给区间[a,b]的所有数都增加X
2:询问第i个数是什么?
第一行一个正整数n,接下来n行n个整数,再接下来一个正整数Q,表示操作的个数. 接下来Q行每行若干个整数。如果第一个数是1,后接3个正整数a,b,X,表示在区间[a,b]内每个数增加X,如果是2,后面跟1个整数i, 表示询问第i个位置的数是多少。
对于每个询问输出一行一个答案
3
1
2
3
2
1 2 3 2
2 3
5
数据范围
1<=n<=100000
1<=q<=100000
#include <iostream>
#define maxn 100005 using namespace std; int n,m,x,a,b,X;
struct node
{
int now,dis,l,r,mid,flag;
}tree[maxn*]; void tree_up(int now)
{
tree[now].dis=tree[now*].dis+tree[now*+].dis;
return ;
} void tree_build(int now,int l,int r)
{
tree[now].l=l,tree[now].r=r;
if(tree[now].l==tree[now].r)
{
cin>>tree[now].dis;
return ;
}
tree[now].mid=(tree[now].l+tree[now].r)/;
tree_build(now*,l,tree[now].mid);
tree_build(now*+,tree[now].mid+,r);
tree_up(now);
} void tree_down(int now)
{
tree[now*].flag+=tree[now].flag;
tree[now*].dis+=tree[now].flag*(tree[now*].r-tree[now*].l+);
tree[now*+].flag+=tree[now].flag;
tree[now*+].dis+=tree[now].flag*(tree[now*+].r-tree[now*+].l+);
tree[now].flag=; return ;
} void tree_change(int now,int l,int r,int x)
{
if(tree[now].l==l&&tree[now].r==r)
{
tree[now].dis+=x*(r-l+);
tree[now].flag+=x;
return ;
}
if(tree[now].flag) tree_down(now);
if(tree[now].mid>=r) tree_change(now*,l,r,x);
else if(tree[now].mid<l) tree_change(now*+,l,r,x);
else
{
tree_change(now*,l,tree[now].mid,x);
tree_change(now*+,tree[now].mid+,r,x);
}
tree_up(now);
} int tree_query(int now,int to)
{
if(tree[now].l==tree[now].r) return tree[now].dis;
if(tree[now].flag) tree_down(now);
if(tree[now].mid>=to) return tree_query(now*,to);
else if(tree[now].mid<to) return tree_query(now*+,to);
} int main()
{
cin>>n;
tree_build(,,n);
cin>>m;
while(m--)
{
cin>>x;
if(x==)
{
cin>>a>>b>>X;
tree_change(,a,b,X);
}
else
{
cin>>X;
cout<<tree_query(,X)<<endl;
}
}
return ;
}
区间改变 单点查询
T1081 线段树练习 2 codevs的更多相关文章
- AC日记——线段树练习三 codevs 1082 (分块尝试)
线段树练习 3 思路: 分块: 来,上代码: #include <cmath> #include <cstdio> #include <cstring> #incl ...
- AC日记——线段树练习4 codevs 4919
4919 线段树练习4 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 给你N个数,有两种操作 ...
- AC日记——线段树练习5 codevs 4927
4927 线段树练习5 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 有n个数和5种操作 add a b ...
- T1082 线段树练习3 codevs
http://codevs.cn/problem/1082/ 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 ...
- codevs 1080 线段树练习 CDQ分治
codevs 1080 线段树练习 http://codevs.cn/problem/1080/ 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 一行N个 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
随机推荐
- 推荐一波 瀑布流的RecylceView
推荐博客:http://www.bubuko.com/infodetail-999014.html
- Hdu 4738 Caocao's Bridges (连通图+桥)
题目链接: Hdu 4738 Caocao's Bridges 题目描述: 有n个岛屿,m个桥,问是否可以去掉一个花费最小的桥,使得岛屿边的不连通? 解题思路: 去掉一个边使得岛屿不连通,那么去掉的这 ...
- HTML基础2——综合案例2——复杂的嵌套列表
<html> <head> <title></title> </head> <body> <ul type="d ...
- git初使用的心得
转到Java方向后,版本控制工具也开始以git为主了.由于之前不怎么使用bash,所以目前还是以ui工具,比如sourcetree为主导,但一些简单的操作命令,已经能够快速地使用.sourcetree ...
- <a>标签的href、onclick属性
链接的 onclick 事件被先执行,其次是 href 属性下的动作(页面跳转,或 javascript 伪链接): 参考:https://www.cnblogs.com/happykakeru/ar ...
- python 关于一个懒惰和非懒惰的
>>> pa = re.compile(r'<.*>') >>> result = pa.findall('<H1>title</H1 ...
- android开发小内容
EditText弹出输入数字:android:inputType="phone"
- 如何安装Ant,配置环境变量??
Apache Ant,是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发. Ant是一个基于Java,并且主要用于Java工程的构建工具.Ant本意是A ...
- Redis系列(九)--几道面试题
这里只是一点面试题,想了解更多,可以查看本人的Redis系列:https://www.cnblogs.com/huigelaile/category/1461895.html 1.Redis和Memc ...
- java虚拟机(九)--常用jvm参数
1.-Xms20M: 表示设置JVM启动内存的最小值为20M,必须以M为单位 2.-Xmx20M: 表示设置JVM启动内存的最大值为20M,必须以M为单位.将-Xmx和-Xms设置为一样可以避免JVM ...