热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CodeForces315B:线段树与区间更新

题目概述:Sereja拥有一个由n个整数组成的数组a1,a2,...,an。他计划执行m项操作,这些操作包括更新数组中的特定元素、增加数组中所有元素的值,以及查询数组中的特定元素。

题目描述:

Sereja 拥有一个包含 n 个整数的数组 a1, a2, ..., an。他非常活跃,计划执行 m 次操作。这 m 次操作分为三种类型:

  1. 将第 vi 个数组元素设置为 xi。即执行 avi = xi。
  2. 将每个数组元素增加 yi。即对所有的 ai 执行 ai = ai + yi (1 ≤ i ≤ n)。
  3. 在纸上写下第 qi 个数组元素的值。即查询 aqi 的值。

请帮助 Sereja 完成所有这些操作。

输入

第一行包含两个整数 n 和 m (1 ≤ n, m ≤ 10^5),表示数组的长度和操作的数量。第二行包含 n 个用空格分隔的整数 a1, a2, ..., an (1 ≤ ai ≤ 10^9),表示原始数组的内容。

接下来的 m 行描述了 m 次操作,第 i 行描述了第 i 次操作。每行的第一个整数 ti (1 ≤ ti ≤ 3) 表示操作类型。如果 ti = 1,则后跟两个整数 vi 和 xi (1 ≤ vi ≤ n, 1 ≤ xi ≤ 10^9);如果 ti = 2,则后跟一个整数 yi (1 ≤ yi ≤ 10^4);如果 ti = 3,则后跟一个整数 qi (1 ≤ qi ≤ n)。

输出

对于每次第三类操作,输出对应的 aqi 值。按照输入中查询出现的顺序输出结果。

样例

输入

10 11
1 2 3 4 5 6 7 8 9 10
3 2
3 9
2 10
3 1
3 10
1 1 10
2 10
2 10
3 1
3 10
3 9

输出

2
9
11
20
30
40
39

问题分析:此问题可以通过使用线段树来高效地处理区间更新和单点查询。

解决方案代码

#include 
#include
#include
#include
using namespace std;
const int maxn = 1e5 + 100;
struct Node {
int l, r, val;
} tree[maxn * 4];
int a[maxn];

void build(int root, int l, int r) {
tree[root].l = l;
tree[root].r = r;
tree[root].val = 0;
if (l == r) {
tree[root].val = a[l];
return;
}
int mid = (l + r) >> 1;
build(root <<1, l, mid);
build(root <<1 | 1, mid + 1, r);
}

void pushdown(int root) {
if (tree[root].val != 0) {
tree[root <<1].val += tree[root].val;
tree[root <<1 | 1].val += tree[root].val;
tree[root].val = 0;
}
}

void update(int root, int l, int r, int cur, int op) {
if (l <= tree[root].l && r >= tree[root].r) {
if (op == 2) tree[root].val += cur;
else tree[root].val = cur;
return;
}
pushdown(root);
int mid = (tree[root].l + tree[root].r) >> 1;
if (l <= mid) update(root <<1, l, r, cur, op);
if (r > mid) update(root <<1 | 1, l, r, cur, op);
}

int query(int root, int pos) {
if (tree[root].l == tree[root].r) {
return tree[root].val;
}
pushdown(root);
int mid = (tree[root].l + tree[root].r) >> 1;
if (pos <= mid) return query(root <<1, pos);
else return query(root <<1 | 1, pos);
}

int main() {
int n, m;
while (scanf("%d%d", &n, &m) != EOF) {
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
build(1, 1, n);
for (int i = 1; i <= m; i++) {
int t;
scanf("%d", &t);
if (t == 1) {
int pos, x;
scanf("%d%d", &pos, &x);
update(1, pos, pos, x, 1);
} else if (t == 2) {
int v;
scanf("%d", &v);
update(1, 1, n, v, 2);
} else if (t == 3) {
int pos;
scanf("%d", &pos);
printf("%d\n", query(1, pos));
}
}
}
return 0;
}

推荐阅读
  • 本文深入探讨了POJ2762问题,旨在通过强连通分量缩点和单向连通性的判断方法,解决有向图中任意两点之间的可达性问题。文章详细介绍了算法原理、实现步骤,并附带完整的代码示例。 ... [详细]
  • 本文介绍了一种解决二元可满足性(2-SAT)问题的方法。通过具体实例,详细解释了如何构建模型、应用算法,并提供了编程实现的细节和优化建议。 ... [详细]
  • 本题探讨了在一个有向图中,如何根据特定规则将城市划分为若干个区域,使得每个区域内的城市之间能够相互到达,并且划分的区域数量最少。题目提供了时间限制和内存限制,要求在给定的城市和道路信息下,计算出最少需要划分的区域数量。 ... [详细]
  • 本题旨在通过给定的评级信息,利用拓扑排序和并查集算法来确定全球 Tetris 高手排行榜。题目要求判断是否可以根据提供的信息生成一个明确的排名表,或者是否存在冲突或信息不足的情况。 ... [详细]
  • 数据结构入门:栈的基本概念与操作
    本文详细介绍了栈这一重要的数据结构,包括其基本概念、顺序存储结构、栈的基本操作(如入栈、出栈、清空栈和销毁栈),以及如何利用栈实现二进制到十进制的转换。通过具体代码示例,帮助读者更好地理解和应用栈的相关知识。 ... [详细]
  • 本文介绍了Linux系统中的文件IO操作,包括文件描述符、基本文件操作函数以及目录操作。详细解释了各个函数的参数和返回值,并提供了代码示例。 ... [详细]
  • 本文探讨了在C++中如何有效地清空输入缓冲区,确保程序只处理最近的输入并丢弃多余的输入。我们将介绍一种不阻塞的方法,并提供一个具体的实现方案。 ... [详细]
  • 本文详细介绍了 Java 中的 org.apache.hadoop.registry.client.impl.zk.ZKPathDumper 类,提供了丰富的代码示例和使用指南。通过这些示例,读者可以更好地理解如何在实际项目中利用 ZKPathDumper 类进行注册表树的转储操作。 ... [详细]
  • 树链问题的优化解法:深度优先搜索与质因数分解
    本文介绍了一种通过深度优先搜索(DFS)和质因数分解来解决最长树链问题的方法。我们通过枚举树链上的最大公约数(GCD),将所有节点按其质因子分类,并计算每个类别的最长链,最终求得全局最长链。 ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 本文探讨了如何在iOS开发环境中,特别是在Xcode 6.1中,设置和应用自定义文本样式。我们将详细介绍实现方法,并提供一些实用的技巧。 ... [详细]
  • 本文介绍如何在 C++ 中使用链表结构存储和管理数据。通过具体示例,展示了静态链表的基本操作,包括节点的创建、链接及遍历。 ... [详细]
  • 本问题探讨了在特定条件下排列儿童队伍的方法数量。题目要求计算满足条件的队伍排列总数,并使用递推算法和大数处理技术来解决这一问题。 ... [详细]
  • 问题描述:通过添加最少数量的括号,使得给定的括号序列变为合法,并输出最终的合法序列。数据范围:字符串长度不超过100。涉及算法:区间动态规划(Interval DP)。 ... [详细]
author-avatar
我只当你的千纸鹤
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有