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 - 敌兵布阵的更多相关文章

  1. [kuangbin带你飞]专题七 线段树

            ID Origin Title 228 / 440 Problem A HDU 1166 敌兵布阵   207 / 438 Problem B HDU 1754 I Hate It   ...

  2. 【算法系列学习】线段树 区间修改,区间求和 [kuangbin带你飞]专题七 线段树 C - A Simple Problem with Integers

    https://vjudge.net/contest/66989#problem/C #include<iostream> #include<cstdio> #include& ...

  3. 【算法系列学习】线段树 单点覆盖,区间查询最大值 [kuangbin带你飞]专题七 线段树 B - I Hate It

    https://vjudge.net/contest/66989#overview #include<iostream> #include<cstdio> #include&l ...

  4. HDU 1166 敌兵布阵 (树状数组 单点修改+区间查询)

    题目链接 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和T ...

  5. HDU - 3001 Travelling 状压dp + 三进制 [kuangbin带你飞]专题二

    终于刷完搜索专题了. 题意:给定n个城市,每个城市参观不能超过两次,两个城市之间有道路通过需要花费X,求通过能所有城市的最小花费. 思路:每个城市有三个状态0,1,2,可用三进制存储所有城市的访问状态 ...

  6. TZOJ 2725 See you~(二维树状数组单点更新区间查询)

    描述 Now I am leaving hust acm. In the past two and half years, I learned so many knowledge about Algo ...

  7. 【bzoj5173】[Jsoi2014]矩形并 扫描线+二维树状数组区间修改区间查询

    题目描述 JYY有N个平面坐标系中的矩形.每一个矩形的底边都平行于X轴,侧边平行于Y轴.第i个矩形的左下角坐标为(Xi,Yi),底边长为Ai,侧边长为Bi.现在JYY打算从这N个矩形中,随机选出两个不 ...

  8. 【bzoj3132】上帝造题的七分钟 二维树状数组区间修改区间查询

    题目描述 “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. ...

  9. 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询

    题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...

随机推荐

  1. mybatis基础学习4---懒加载和缓存

    1:懒加载 1)在主配置文件设置(要放在配置文件最前面) <!-- 延迟加载配置,两个都必须同时有 --> <settings> <!-- lazyLoadingEnab ...

  2. git中常见的几个命令

    git中常见的几个命令 本地仓库 三个区域 工作目录 暂存区 本地仓库 文件的四个状态 未跟踪 untracked 已暂存 staged 已提交commited 已修改 modified 基本命令 g ...

  3. C#对委托的初步理解理解

    作为新手对委托的学习: 1.定义委托:委托实际上是一个类,在定义委托前就知道了方法的返回类型和方法的参数类型(可以把委托理解为只知道方法的返回类型和方法的参数类型,不知道方法体) public  de ...

  4. 为什么用IP无法访问网站,域名可以访问?

    我们访问网站都是通过域名进行访问的,偶尔会使用网站IP进行访问,如学校通常使用IP登录教务处,但很多的时候我们无法通过ip进行访问其他网站,这就涉及到服务器的问题了. 网站都是依托在服务器上面的,而服 ...

  5. javaScript绑定事件委托 demo

    事件绑定通常发生在 onload 或 DOMContentReady , 事件绑定占用 处理时间 占用内存, 而且不是每个事件都会被 点击执行. 由此 事件委托 可以优化事件绑定行为.. 事件逐层冒泡 ...

  6. 求两个字符串的最长公共子串(LCS)

    http://tianyunpu2008.blog.163.com/blog/static/6559379920089162236915/

  7. C#文件上传类,文件流,字节数组等

    using System;using System.IO;using System.Web;using System.Web.UI.WebControls; namespace DotNet.Util ...

  8. 打印时鼠标键盘移动的div创建

    function createDiv(id, label, offset_left, offset_top) { $("body").append($("<div& ...

  9. MyBatis快速入门(一)

    一.MyBatis背景介绍 MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的 ...

  10. JS中new的自定义实现创建实例对象

    我们都知道在JS中通常通过对象字面量和new关键字来创建对象,那么今天我就来给大家讲讲new是怎么创建实例对象的:首先创建一个构造函数: function Person(name,age){ this ...