HDU- 1166 敌兵布阵 - 线段树

news/2024/11/28 11:44:20/

Lily特别喜欢养花,但是由于她的花特别多,所以照料这些花就变得不太容易。她把她的花依次排成一行,每盆花都有一个美观值。如果Lily把某盆花照料的好的话,这盆花的美观值就会上升,如果照料的不好的话,这盆花的美观值就会下降。有时,Lily想知道某段连续的花的美观值之和是多少,但是,Lily的算术不是很好,你能快速地告诉她结果吗?
Input
第一行一个整数T,表示有T组测试数据。
每组测试数据的第一行为一个正整数N (N<=50000),表示Lily有N盆花。
接下来有N个正整数,第i个正整数ai (1<=ai<=50) 表示第i盆花的初始美观值。
接下来每行有一条命令,命令有4种形式:
(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条
output:
对于第i组数据,首先输出"Case i:"和回车。
对于每个"Query i j"命令,输出第i盆花到第j盆花的美观值之和。

区间查询,单点修改

#include <iostream>
#include <algorithm>using namespace std;const int N = 1e5 + 10;
int n;
int a[N];struct Tree {int left, right;int sum;
}t[4*N];// 更新idx处的sum 
inline void pushup(int idx) { t[idx].sum = t[idx << 1].sum + t[idx << 1 | 1].sum;
}// 建树 
void build(int pos, int left, int right) {t[pos].left = left, t[pos].right = right;if (left == right) {t[pos].sum = a[left];return;}int mid = left + right >> 1;build(pos << 1, left, mid);build(pos << 1 | 1, mid + 1, right);pushup(pos);
}// index处的值加value 
void change(int pos, int index, int value) {if (t[pos].left == t[pos].right) {t[pos].sum += value;return;}int mid = t[pos].left + t[pos].right >> 1;if (index <= mid) {change(pos << 1, index, value);} else {change(pos << 1 | 1, index, value);}pushup(pos);
}// [left, right]区间内元素和 
int query(int pos, int left, int right) {if (t[pos].left >= left && t[pos].right <= right) {return t[pos].sum;}int mid = t[pos].left + t[pos].right >> 1;int tmp = 0;if (left <= mid) {tmp = query(pos << 1, left, right);}if (right > mid) {tmp += query(pos << 1 | 1, left, right);}return tmp;
}int main() {int t = 0;cin >> t;for (int k = 1; k <= t; k ++) {scanf("%d", &n);for (int i = 1; i <= n; i ++) {scanf("%d", &a[i]);}build(1, 1, n);string s;printf("Case %d:\n", k);while(true) {cin >> s;if (s == "End") {break;}int a, b;cin >> a >> b;if (s == "Query") {int r = query(1, a, b);printf("%d\n", r);} else if (s == "Add") {change(1, a, b);} else {change(1, a, -b);}}}return 0;
}

http://www.ppmy.cn/news/96163.html

相关文章

LAMP架构(Apache、Mysql、PHP服务的部署)

目录 一、LAMP架构 1.LAMP组件 二、编译安装Apache httpd服务 1.关闭防火墙&#xff0c;拉取软件包 2.安装环境依赖包 3.配置软件模块 4.编译及安装 5.优化配置文件路径 6.添加httpd系统服务 7.修改httpd 服务配置文件 8.浏览器访问验证 三、编译安装mysqld服务 1.…

NEEPU Sec 2023 公开赛 writeup

文章目录 WebCute CirnoCute Cirno(Revenge) RevHow to use ida?BaseHow to use python?IKUN检查器junk code CryptoFunnyRsaLossloud Misc吉林第一站倒影Shiro重生之我是CTFer 问卷 Web Cute Cirno 学艺不精的我脑袋要炸了 在Cirno界面的源代码中发现任意读 考虑之前的比…

CentOS7.9安装python3.10

CentOS7默认只安装了python2的版本&#xff0c;需要自己手动安装python3&#xff0c;方法如下&#xff1a; 一、升级openssl到1.1以上 # 1.安装对应的依赖库 sudo yum install -y zlib yum install zlib-devel openssl-devel sqlite-devel bzip2-devel libffi libffi-devel …

传统加密技术(恺撒+仿射)

1.Caesar cipher恺撒密码 是一种最简单且最广为人知的加密技术。它是一种替换加密的技术&#xff0c;明文中的所有字母都在字母表上向后&#xff08;或向前&#xff09;按照一个固定数目进行偏移后被替换成密文。 加密对象&#xff1a;英文字母 密钥格式&#xff1a;k&#…

数据结构与算法·第2章【线性表】

线性结构具有以下基本特征&#xff1a; 有唯一的一个被称为首元素&#xff08;或头元素&#xff09;的元素&#xff0c;没有直接前驱&#xff1b;有唯一的一个被称为尾元素&#xff08;或尾节点&#xff09;的元素&#xff0c;没有直接后继。 数据元素之间存在一对一的线性关…

S32K144开发板

目录 一&#xff0e;S32K144开发板概述 二&#xff0e;产品技术和功能规格 三&#xff0e;开发环境 1.S32K144的开发环境主流是这么三种&#xff1a; 2.开发板Demo工程 四&#xff0e;S32K144开发板实物图 五、汽车大灯硬件架构 一&#xff0e;S32K144开发板概述 S32K14…

canal server 标准化集群搭建(完结)

4.2. 创建 server 所属集群&#xff1a;选择刚才添加的 “集群名称” server 名称&#xff1a; server_1、server_2、server_3 依次类推 server ip&#xff1a;server 的 ip 地址 admin 端口&#xff1a;canal server 与 canal admin 的通信端口&#xff0c;非生产环境从 2…

数字图像和光学图像的区别?

如果您曾经尝试在走路时在手机上拍摄视频&#xff0c;您就会知道保持图像静止是很棘手的。有一些巧妙的技术旨在减少这种摇晃的凸轮效应&#xff0c;并且有两种不同的方法来实现它。 光学图像稳定来自静态摄影领域&#xff0c;使用镜头内部的复杂硬件机制来保持图像静止并实现…