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. 记 suds 模块循环依赖的坑-RuntimeError: maximum recursion depth exceeded

    下面是soa接口调用的核心代码 #! /usr/bin/python # coding:utf-8 from suds.client import Clientdef SoaRequest(wsdl, ...

  2. 【转】Django HTTP请求的处理流程

    Django 和其他 Web 框架的 HTTP 处理的流程大致相同,Django 处理一个 Request 的过程是首先通过中间件,然后再通过默认的 URL 方式进行的.我们可以在 Middlewar ...

  3. KVC与KVO理解

    转载:https://magicalboy.com/kvc_and_kvo/ KVC 与 KVO 理解 KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲 ...

  4. WebX框架学习笔记之一

    Webx是什么? Webx是一套基于Java Servlet API的通用Web框架.它在Alibaba集团内部被广泛使用.从2010年底,向社会开放源码. Webx的发展历史 2001年,阿里巴巴内 ...

  5. (10)集合之双列集合Map,HashMap,TreeMap

    Map中的元素是两个对象,一个对象作为键,一个对象作为值.键不可以重复,但是值可以重复. 看顶层共性方法找子类特有对象. Map与Collection在集合框架中属并列存在 Map存储的是键值对 Ma ...

  6. 【G】开源的分布式部署解决方案文档 - 手动安装

    G.系列导航 [G]开源的分布式部署解决方案 - 导航 序言 因各种原因,决定先写使用文档.也证明下项目没有太监.至于安装过程复杂,是因为还没有做一键安装,这个现阶段确实没精力. 项目进度 (点击图片 ...

  7. 【C++】智能指针详解(一):智能指针的引入

    智能指针是C++中一种利用RAII机制(后面解释),通过对象来管理指针的一种方式. 在C++中,动态开辟的内存需要我们自己去维护,在出函数作用域或程序异常退出之前,我们必须手动释放掉它,否则的话就会引 ...

  8. reactjs点滴记录

    reactjs: render方法后面,}后面,不要加分号,加逗号,因为是对属性赋值,否则报错: var Test = React.createClass({ render:function(){re ...

  9. Math.pow用法及实现探究

    pow函数在java.lang.Math类中,是求次方的函数,定义为: public static double pow(double a, double b): 即求a的b次方,例如: public ...

  10. MySQL学习笔记(四)—存储过程

    一.概述      存储过程是数据库定义的一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句.存储过程可以避免开发人员重复的编写相同的SQL语句,而且存储过程是在MySq ...