Codevs 1081 线段树练习2
给你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
树状数组:(数据太弱,暴力都AC)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,t[];
void add(int k,int z)
{
while(k<=n)
{
t[k]+=z;
k+=k&(-k);
}
}
int find(int x)
{
int ans=;
while(x)
{
ans+=t[x];
x-=x&(-x);
}
return ans;
}
int main()
{
cin>>n;
for(int i=;i<=n;i++)
{
int x;
cin>>x;
add(i,x);
}
cin>>m;
for(int i=;i<=m;i++)
{
int a,b,c,d,e,f;
cin>>a;
if(a==) {
cin>>d>>e>>f;
for(int j=d;j<=e;j++)
add(j,f);
}
if(a==)
{
cin>>b;
printf("%d\n",find(b)-find(b-));
}
} return ;
}
用的是练习1的代码,稍加修改,加上数据太弱~~~~~~就AC啦~~
正解:(区间修改+单点查询)
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100010
using namespace std;
int n,m,a[maxn],t[maxn];
void add(int k,int z)
{
while(k<=n)
{
t[k]+=z;
k+=k&(-k);
}
}
int find(int k)
{
int ans=;
while(k)
{
ans+=t[k];
k-=k&(-k);
}
return ans;
}
int main()
{
int i,j,k;
scanf("%d",&n);
for(i=;i<=n;i++)
scanf("%d",&a[i]);
for(i=;i<=n;i++)
add(i,a[i]-a[i-]);
scanf("%d",&m);
for(i=;i<=m;i++)
{
int x,y,z,w;
scanf("%d",&w);
if(w==)
{
scanf("%d%d%d",&x,&y,&z);
add(x,z);
add(y+,-z);
}
else
if(w==)
{
scanf("%d",&x);
printf("%d\n",find(x));
}
}
return ;
}
思想 :t数组存放差分序列即a[i]-a[i-1],区间修改时 只需修改 两端点处的值即可【左端点加X,右端点减X】 单点查询时:输出从差分序列从1到i的和
图片有点烂,将就看吧
Codevs 1081 线段树练习2的更多相关文章
- Codevs 1081 线段树练习 2
1081 线段树练习 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 传送门 题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的 ...
- codevs——1081 线段树练习 2
1081 线段树练习 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Description 给你N个数,有两种操作 1:给 ...
- codevs 1081 线段树练习2 (线段树)
题目: 题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所有数都增加X 2:询问第i个数是什么? 输入描述 Input Description 第一行一个正整数n,接下 ...
- codevs 1081 线段树练习 2 线段树
题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所有数都增加X 2:询问第i个数是什么? 输入描述 Input Description 第一行一个正整数n,接下来n行n ...
- codevs 1081 线段树练习 2 区间更新 单点查询 无lazy
题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所有数都增加X 2:询问第i个数是什么? 输入描述 Input Description 第一行一个正整数n,接下来n行n ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- codevs 1080 线段树练习 CDQ分治
codevs 1080 线段树练习 http://codevs.cn/problem/1080/ 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 一行N个 ...
随机推荐
- OS X 10.9 Mavericks 安装 thrift 0.9.1
通过Homebrew安装的时候,编译会报错.查了一下资料,原来是10.9系统默认使用的libc++的库,而且移除了C++ 11标准前tr库,所以编译存在问题.且笔者使用的时候,brew安装只支持到0. ...
- QStyle
转贴: http://hi.baidu.com/yjj2008/blog/item/6cd4a1892ef0d4b60f2444a5.html 本文介绍了如何使用qt提供的接口来设计自己的GUI风格( ...
- 关于修改Android手机的音量
首先,必须要获取系统的声音服务权限 <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS&qu ...
- 解决Lost connection to MySQL server at 'reading initial communication packet', 的方法
今天用heidsql连接mysql时出了问题,提示:Lost connection to MySQL server at 'reading initial communication packet 网 ...
- mysql避免插入重复数据
我们在进行数据库操作的时候,有时候需要插入不重复的数据.所谓不重复的数据,可以是某个字段不重复,也可以是某几个字段重复.当然我们可以在插入之前先将数据库的数据查询出来,然后与将要插入的数据进行对比,如 ...
- 自定义PopupWindow弹出框(带有动画)
使用PopupWindow来实现弹出框,并且带有动画效果 首先自定义PopupWindow public class LostPopupWindow extends PopupWindow { pub ...
- Ubuntu/Debian 安装lxml的正确方式
lxml是Python的一个库,主要用于处理XML和HTML. 最近需要用lxml,但是在Ubuntu上直接pip安装失败,研究了半天终于找到了正确安装方法,记录在此. 由于Ubuntu和Debian ...
- Jmeter参数化的4种方法
用Jmeter测试时包含两种情况的参数,一种是在url中,一种是请求中需要发送的参数. URL中的参数,如:http://blog.da-fang.com/index.php/2010/06/01/j ...
- XML 命名空间
XML 命名空间 一.XML命名冲突 在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突. 这个 XML 文档携带着某个表格中的信息: <table& ...
- miniui MVC datagrid数据绑定
数据绑定 Default.cshtml <div id="datagrid1" class="mini-datagrid" style="wid ...