题目描述

食堂有N个打饭窗口,现在正到了午饭时间,每个窗口都排了很多的学生,而且每个窗口排队的人数在不断的变化。
现在问你第i个窗口到第j个窗口一共有多少人在排队?

输入

输入的第一行是一个整数T,表示有T组测试数据。
每组输入的第一行是一个正整数N(N<=30000),表示食堂有N个窗口。
接下来一行输入N个正整数,第i个正整数ai表示第i个窗口最开始有ai个人排队。(1<=ai<=50)
接下来每行有一条命令,命令有四种形式:
(1)Add i j,i和j为正整数,表示第i个窗口增加j个人(j不超过30);
(2)Sub i j,i和j为正整数,表示第i个窗口减少j个人(j不超过30);
(3)Query i j,i和j为正整数,i<=j,表示询问第i到第j个窗口的总人数;
(4)End 表示结束,这条命令在每组数据最后出现;
每组数据最多有40000条命令。

输出

对于每组输入,首先输出样例号,占一行。
然后对于每个Query询问,输出一个整数,占一行,表示询问的段中的总人数,这个数保持在int以内。

样例输入 Copy

1
10
1 2 3 4 5 6 7 8 9 10
Query 1 3
Add 3 6
Query 2 7
Sub 10 2
Add 6 3
Query 3 10
End

样例输出 Copy

Case 1:
6
33
59 这一题可以通过线段树来解决
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
using namespace std;
const int SIZE=;
struct SegmentTree{
int l,r;
int dat;
} t[SIZE*];//struct数组存储线段树
int a[SIZE];
void build(int p,int l,int r){
t[p].l=l;t[p].r=r;//节点p表示区间l-r
if(l==r){
t[p].dat=a[l];
return;
}//叶节点
int mid=(l+r)/;//折半
build(p*,l,mid);//左子节点[l,mid],编号p*2
build(p*+,mid+,r); //右子节点[mid+1,r],编号p*2+1
t[p].dat=t[p*].dat+t[p*+].dat;//从下往上传递信息 }
int ask(int p,int l,int r)//查询区间和
{
if(l<=t[p].l&&r>=t[p].r)
return t[p].dat;
int mid=(t[p].l+t[p].r)/;
int val=;
if(l<=mid) val+=ask(p*,l,r);//左子节点有重叠
if(r>mid) val+=ask(p*+,l,r); //右子节点有重叠
return val;
}
void change(int p,int x,int v,int xx){//单点修改
if(t[p].l==t[p].r){//找到叶节点
if(xx==)
t[p].dat+=v;
if(xx==-)
t[p].dat-=v;
return;
}
int mid=(t[p].l+t[p].r)/;
if(x<=mid) change(p*,x,v,xx);//x属于左半区间
else change(p*+,x,v,xx); //x属于右半区间
t[p].dat=t[p*].dat+t[p*+].dat;//从下往上更新信息
}
int main()
{
int t;
cin>>t;
for(int i=;i<=t;i++){
cout<<"Case "<<i<<":"<<endl;
int n;
cin>>n;
for(int i=;i<=n;i++)
cin>>a[i];
build(,,n);//建立线段树
string s;
while(cin>>s){
if(s=="End")
break;
int a,b;
cin>>a>>b;
if(s=="Query")
cout<<ask(,a,b)<<endl;
if(s=="Add")
change(,a,b,);
if(s=="Sub")
change(,a,b,-);
}
} return ;
}
通过线段树可以快速进行单点更新 和 区间求和
相当于一个非常巧妙的递归
先从上往下到叶节点
再将叶节点往上累加
再从下回到起点
至于线段树的讲解
可以先看一下下面的讲解哦
https://www.cnblogs.com/Tidoblogs/p/10887555.html

Tido 习题-二叉树-区间查询的更多相关文章

  1. Tido 习题-二叉树-树状数组求逆序对

    这里给大家提供一个全新的求逆序对的方法 是通过树状数组来实现的 题目描述   样例输入 Copy 5 2 3 1 5 4 样例输出 Copy 3 提示     #include<iostream ...

  2. Tido 习题-二叉树-树状数组实现

    题目描述 这就是一个简单的树状数组入门题 可以动态地进行区间和查询 随时可能会进行更新   #include<iostream> #include<cstdio> #inclu ...

  3. Tido 习题-二叉树-最高分

    题目描述 老师想知道从某某同学到某某同学当中,分数最高的是多少.现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 输入 输入包含多组测试数据.每组输入第一行是两个正整数N和M(0& ...

  4. N个元素组成二叉树的种类

    <算法>中的二叉查找树一节的一道习题. N个元素组成的二叉树固定一个根节点,这个根节点的左右子树组合数为(0,n-1),(1,n-2),(2,n-3)...(n-1,0),假设N个元素组成 ...

  5. tyvj P1716 - 上帝造题的七分钟 二维树状数组区间查询及修改 二维线段树

    P1716 - 上帝造题的七分钟 From Riatre    Normal (OI)总时限:50s    内存限制:128MB    代码长度限制:64KB 背景 Background 裸体就意味着 ...

  6. 算法(第四版)C# 习题题解——2.5

    写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更方便的版本见:https ...

  7. 算法(第四版)C# 习题题解——2.4

    写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更方便的版本见:https ...

  8. 算法(第四版)C# 习题题解——2.2

    写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更为方便的版本见:http ...

  9. 6-11-N皇后问题-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第6章  树和二叉树 - N皇后问题 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本 ...

随机推荐

  1. win10 uwp 使用 asp dotnet core 做图床服务器客户端

    原文 win10 uwp 使用 asp dotnet core 做图床服务器客户端 本文告诉大家如何在 UWP 做客户端和 asp dotnet core 做服务器端来做一个图床工具   服务器端 从 ...

  2. iOS8的APP过渡过程

    1. 2. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWluX3hpYW53ZWk=/font/5a6L5L2T/fontsize/400/fill/ ...

  3. windows 的使用 —— 注册表(软件的安装和卸载)

    win + r(run):输入 regedit(register edit)进入: 1. 网络连接 比如一些 vpn 安装之后,会对网络连接进行一定的修改,这样在 vpn 工具删除之后,仍然无法消除修 ...

  4. objective-c启用ARC时的内存管理

    PDF版下载:http://download.csdn.net/detail/cuibo1123/7443125      在objective-c中,内存的引用计数一直是一个让人比較头疼的问题.尤其 ...

  5. matlab 深度学习

    0. 超参的定义 超参的定义直接使用结构体: opts.alpha = 1; opts.batchsize = 50; opts.numepoch = 5; 1. Autoencoder Train ...

  6. Oracle召回

    后几集录制视频,记录在记录开始的时候不知道怎么,录了几集没有什么,够又一次录,过程中也也把Oracle数据库这部分看了一遍,收获也挺多的,学习是反复积累的过程,对于一些零散的知识点又回想了一下,又一次 ...

  7. Template简介

    分类   ControlTemplate ItemsPanelTemplate DataTemplate 样式Style和模板Template对比 Style:样式,风格Template:模版,某种控 ...

  8. css3 位置选择器 类似jq的:eq(0)

    JQ使用 :eq(位置),可以选择第几个元素 CSS3里面新增了一个用法,:nth-child(位置) 可实现和JQ同样的功能 需要注意的是jq第一个是从0开始,CSS的第一个是从1开始

  9. ELINK离线编程器常见问题

    Q1 编程器是否可以接JTAG JTAG接口已经包含SWD接口引脚,按以下引脚对应接线即可: SWDIO->目标板JTAG 的JTMS SWCLK->目标板JTAG 的JTCK Q2 PC ...

  10. Win8Metro(C#)数字图像处理--2.9图像均值滤波

    原文:Win8Metro(C#)数字图像处理--2.9图像均值滤波  [函数名称] 图像均值滤波函数MeanFilterProcess(WriteableBitmap src) [函数代码]    ...