【算法系列学习】线段树vs树状数组 单点修改,区间查询 [kuangbin带你飞]专题七 线段树 A - 敌兵布阵
https://vjudge.net/contest/66989#problem/A
单点修改,区间查询
方法一:线段树
http://www.cnblogs.com/kuangbin/archive/2011/08/15/2139834.html
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib> using namespace std;
const int maxn=5e4+;
const int inf=0x3f3f3f3f;
int num[maxn];
int n;
struct Node
{
int l;
int r;
int nSum;
}segTree[maxn<<]; void Build(int i,int l,int r)
{
segTree[i].l=l;
segTree[i].r=r;
if(l==r)
{
segTree[i].nSum=num[l];
return;
}
int mid=(l+r)>>;
Build(i<<,l,mid);
Build((i<<)|,mid+,r);
segTree[i].nSum=segTree[i<<].nSum+segTree[(i<<)|].nSum;
} void Add(int i,int t,int b)
{
segTree[i].nSum+=b;
if(segTree[i].l==segTree[i].r)
{
return;
}
int mid=(segTree[i].l+segTree[i].r)>>;
if(t<=mid)
{
Add(i<<,t,b);
}
else
{
Add((i<<)|,t,b);
}
} int Query(int i,int l,int r)
{
if(segTree[i].l==l&&segTree[i].r==r)
{
return segTree[i].nSum;
}
int mid=(segTree[i].l+segTree[i].r)>>;
if(r<=mid)
{
return Query(i<<,l,r);
}
else if(l>mid)
{
return Query((i<<)|,l,r);
}
else
{
return Query(i<<,l,mid)+Query((i<<)|,mid+,r);
}
}
int main()
{
int T;
scanf("%d",&T);
int kas=;
while(T--)
{
printf("Case %d:\n",kas++);
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&num[i]);
}
Build(,,n);
char ch[];
int a,b;
while(scanf("%s",ch)==&&ch[]!='E')
{
scanf("%d%d",&a,&b);
if(ch[]=='Q')
{
int ans=Query(,a,b);
printf("%d\n",ans);
}
else if(ch[]=='A')
{
Add(,a,b);
}
else
{
Add(,a,-b);
}
}
}
return ;
}
方法二:树状数组
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib> using namespace std;
const int maxn=5e4+;
const int inf=0x3f3f3f3f;
int tree[maxn];
int n;
void Init()
{
memset(tree,,sizeof(tree));
}
int lowbit(int x)
{
return x&-x;
} void Add(int i,int x)
{
while(i<=n)
{
tree[i]+=x;
i+=lowbit(i);
}
} int Query(int i)
{
int res=;
while(i)
{
res+=tree[i];
i-=lowbit(i);
}
return res;
} void Setval(int i,int x)
{
int v=Query(i)-Query(i-);
Add(i,-v);
Add(i,x);
} int Query(int l,int r)
{
return Query(r)-Query(l-);
} int main()
{
int T;
scanf("%d",&T);
for(int kas=;kas<=T;kas++)
{
Init();
scanf("%d",&n);
int x;
for(int i=;i<=n;i++)
{
scanf("%d",&x);
Add(i,x);
}
printf("Case %d:\n",kas);
char ch[];
int a,b;
while(scanf("%s",ch)==&&ch[]!='E')
{
scanf("%d%d",&a,&b);
if(ch[]=='A')
{
Add(a,b);
}
else if(ch[]=='S')
{
Add(a,-b);
}
else
{
int ans=Query(a,b);
printf("%d\n",ans);
}
}
}
return ;
}
【算法系列学习】线段树vs树状数组 单点修改,区间查询 [kuangbin带你飞]专题七 线段树 A - 敌兵布阵的更多相关文章
- [kuangbin带你飞]专题七 线段树
ID Origin Title 228 / 440 Problem A HDU 1166 敌兵布阵 207 / 438 Problem B HDU 1754 I Hate It ...
- 【算法系列学习】线段树 区间修改,区间求和 [kuangbin带你飞]专题七 线段树 C - A Simple Problem with Integers
https://vjudge.net/contest/66989#problem/C #include<iostream> #include<cstdio> #include& ...
- 【算法系列学习】线段树 单点覆盖,区间查询最大值 [kuangbin带你飞]专题七 线段树 B - I Hate It
https://vjudge.net/contest/66989#overview #include<iostream> #include<cstdio> #include&l ...
- HDU 1166 敌兵布阵 (树状数组 单点修改+区间查询)
题目链接 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和T ...
- HDU - 3001 Travelling 状压dp + 三进制 [kuangbin带你飞]专题二
终于刷完搜索专题了. 题意:给定n个城市,每个城市参观不能超过两次,两个城市之间有道路通过需要花费X,求通过能所有城市的最小花费. 思路:每个城市有三个状态0,1,2,可用三进制存储所有城市的访问状态 ...
- TZOJ 2725 See you~(二维树状数组单点更新区间查询)
描述 Now I am leaving hust acm. In the past two and half years, I learned so many knowledge about Algo ...
- 【bzoj5173】[Jsoi2014]矩形并 扫描线+二维树状数组区间修改区间查询
题目描述 JYY有N个平面坐标系中的矩形.每一个矩形的底边都平行于X轴,侧边平行于Y轴.第i个矩形的左下角坐标为(Xi,Yi),底边长为Ai,侧边长为Bi.现在JYY打算从这N个矩形中,随机选出两个不 ...
- 【bzoj3132】上帝造题的七分钟 二维树状数组区间修改区间查询
题目描述 “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. ...
- 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询
题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...
随机推荐
- Winform自定义控件在界面上拖动、滚动鼠标。。会闪烁的解决方法
环境说明: 项目中有一个基类窗体BaseForm,有一个自定义控件TextBoxBase,两个控件都做了一些独特常规的封装和重写,在TextBoxBase中有一点重绘的下划线,发现在窗体运行之后, ...
- C#基础笔记---浅谈XML读取以及简单的ORM实现
背景: 在开发ASP.NETMVC4 项目中,虽然web.config配置满足了大部分需求,不过对于某些特定业务,我们有时候需要添加新的配置文件来记录配置信息,那么XML文件配置无疑是我们选择的一个方 ...
- Python(五)编程小实例
Python(五)编程小实例 抓取网页信息,并生成txt文件内容! Python抓取网页技能--Python抓取网页就是我们常看见的网络爬虫,我们今天所要用到的就是我们Python中自带的模块,用这些 ...
- iOS网络编程笔记——XML文档解析
今天利用多余时间研究了一下XML文档解析,虽然现在移动端使用的数据格式基本为JSON格式,但是XML格式毕竟多年来一直在各种计算机语言之间使用,是一种老牌的经典的灵活的数据交换格式.所以我认为还是很有 ...
- Android Things教程:电气基础之直流电路理论
译者注:由于本人水平有限,译文中难免会出现概念模糊.晦涩难懂,如果实在没心思看下去,请发挥你的学习能动性,到原文中自行翻译,感谢!!!点这里,直达英文各种长句的世界. 好了,既然你选择继续往下看,那就 ...
- 这是对position讲解最通俗易懂的版本了。
position 为了制作更多复杂的布局,我们需要讨论下 position 属性.它有一大堆的值,名字还都特抽象,别提有多难记了.让我们先一个个的过一遍,不过你最好还是把这页放到书签里. static ...
- RN 导入原有Xcode项目中,引入Pod依赖出现的问题与解决
RN 导入原有Xcode项目中,引入Pod依赖出现的问题与解决 前言 最近学习React Native技术.将RN引入到原来Xcode项目中有一步:给原来Xcode项目添加所需要的Pod依赖 写好Po ...
- Python之路-Linux命令基础(3)
作业一: 1)将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) 2)将用户信息数据库文件和用户密码数据库文件纵向合并为一个文件/2.txt(追加) 3)将/1.txt./2 ...
- 老李分享:持续集成学好jenkins
老李分享:持续集成学好jenkins poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest测试开发工程师就业培训请大 ...
- Math.pow用法及实现探究
pow函数在java.lang.Math类中,是求次方的函数,定义为: public static double pow(double a, double b): 即求a的b次方,例如: public ...