CSP-S 例题10-3 树状数组

描述

已知一个数列,你需要进行下面两种操作:

  • 将某一个数加上 x
  • 求出某区间每一个数的和

输入描述

第一行包含两个正整数 n,m,分别表示该数列数字的个数和操作的总个数。
第二行包含 n 个用空格分隔的整数,其中第 i 个数字表示数列第 i 项的初始值。
接下来 m 行每行包含 3 个整数,表示一个操作,具体如下:

  • 1 x k 含义:将第 x 个数加上 k

  • 2 x y 含义:输出区间 [x,y] 内每个数的和

输出描述

输出包含若干行整数,即为所有操作 2 的结果。

样例输入 1 

5 5
1 5 4 2 3
1 1 3
2 2 5
1 3 -1
1 4 2
2 1 4

样例输出 1 

14
16

提示

【数据范围】

对于 30% 的数据,1≤n≤8,1≤m≤10;
对于 70% 的数据,1≤n,m≤104;
对于 100% 的数据,1≤n,m≤5×105。
数据保证对于任意时刻,a 的任意子区间(包括长度为 1 和 n 的子区间)和均在 [−231,231) 范围内。

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[1000010];//原始数组
int c[1000010];//树状数组
int 
<think>嗯,用户现在问的是CSP-J竞赛中最常用的数据结构有哪些。我需要先回顾一下CSP-J的考试范围和难度。CSP-J主要面向初中和小学高年级学生,所以数据结构部分应该不会太复杂,但需要覆盖基础且常用的结构。 首先,用户可能正在准备竞赛,需要知道重点复习哪些数据结构。他们可能已经有一定的编程基础,比如学过C++的基本语法和简单算法,但现在需要明确在数据结构方面应该重点掌握哪些内容。 接下来,我得列出CSP-J中常见的数据结构。常见的可能有数组、字符串、结构体、栈、队列,可能还有简单的树结构比如二叉树,以及哈希表。但哈希表在CSP-J中可能不会太深入,可能只是简单的应用,比如使用数组模拟或者STL中的map。 然后,要具体说明每种数据结构的使用场景和例题。比如数组用于存储线性数据,字符串处理题目,结构体用于组合数据,栈用于括号匹配,队列用于BFS,二叉树用于遍历问题等。 需要注意的是,CSP-J的题目难度可能不会涉及太高级的数据结构,比如图的高级算法或者复杂的树结构,更多是基础应用。因此,回答时要强调这些基础结构的重要性,并给出实际例题帮助理解。 另外,用户可能还希望了解如何有效学习和应用这些数据结构,所以可以加入学习建议,比如多做模拟题,注意边界条件,使用STL等。 最后,检查是否有遗漏的数据结构,比如链表可能在CSP-J中出现较少,或者二维数组的应用是否属于数据结构范畴。需要确认常见的如栈、队列、结构体是否覆盖全面,以及是否提到了STL的使用,因为这在竞赛中能节省时间。</think>CSP-J竞赛中常用的数据结构主要围绕基础、高效且适合解决算法问题的类型展开。以下是重点需要掌握的内容及典型应用场景: --- ### **一、基础数据结构** 1. **数组(一维/二维)** - **用途**:存储线性数据、模拟矩阵、统计频率等 - **例题**:约瑟夫环问题、图像旋转、统计字符出现次数 - **技巧**:用数组下标映射数据(如`cnt[100]`统计数字出现次数) 2. **字符串** - **处理重点**:字符遍历、子串提取、回文判断 - **案例**:密码强度检查、字符串反转、凯撒密码加解密 - **注意**:C风格字符串以`\0`结尾,`string`类更安全 3. **结构体(struct)** - **使用场景**:组合多个数据类型(如学生信息管理) ```cpp struct Student { string name; int score; }; Student stu[100]; ``` --- ### **二、线性结构** 1. **栈(Stack)** - **特性**:后进先出(LIFO) - **应用**:括号匹配、表达式求值、迷宫回溯 - **手写实现**: ```cpp int stack[100], top = -1; void push(int x) { stack[++top] = x; } int pop() { return stack[top--]; } ``` 2. **队列(Queue)** - **特性**:先进先出(FIFO) - **应用**:广度优先搜索(BFS)、滑动窗口问题 - **STL用法**: ```cpp #include <queue> queue<int> q; q.push(1); q.pop(); ``` --- ### **三、树形结构** 1. **二叉树基础** - **核心考点**:前序/中序/后序遍历、层序遍历 - **存储方式**:结构体+指针 或 数组模拟(完全二叉树) - **例题**:计算二叉树深度、判断对称二叉树 2. **并查集(Disjoint Set)** - **作用**:高效处理元素分组与合并问题 - **代码模板**: ```cpp int parent[100]; int find(int x) { return parent[x] == x ? x : parent[x] = find(parent[x]); } void merge(int x, int y) { parent[find(x)] = find(y); } ``` --- ### **四、其他实用结构** 1. **哈希表(Hash Table)** - **STL实现**:`unordered_map`快速查询(如统计单词频率) - **限制**:CSP-J中可能禁用STL,需掌握数组模拟方法 2. **优先队列(Priority Queue)** - **STL用法**: ```cpp #include <queue> priority_queue<int> pq; // 默认大根堆 priority_queue<int, vector<int>, greater<int>> min_heap; // 小根堆 ``` - **应用**:求Top K问题、哈夫曼编码 --- ### **五、高频考点与技巧** 1. **复合结构使用** - **案例**:用`结构体数组+排序`解决成绩排名问题 - **案例**:用`栈+哈希表`实现表达式中的运算符优先级处理 2. **空间优化技巧** - **滚动数组**:将二维DP数组压缩为一维(如背包问题) - **位运算压缩**:用二进制位表示状态(如开关灯问题) 3. **STL使用限制** - 部分比赛环境可能限制STL,需掌握手写实现栈/队列的方法 --- ### **六、学习建议** 1. **刷题方向** - 重点练习:NOI官网历年CSP-J真题、洛谷普及组题库 - 必做题目:表达式求值、图的连通性判断、模拟队列/栈操作 2. **避坑指南** - 数组越界:开数组时多留10%空间(如题目说$n≤10^3$则开`int a[1050]`) - 递归爆栈:深层次递归问题(如树高$>10^4$)需改用迭代或手动扩栈 3. **考场策略** - 先画数据结构示意图再编码 - 对大规模数据测试边界情况(如$n=0$或$n=10^5$) --- **附:20组数据结构-算法对应关系** | 数据结构 | 典型算法 | 例题 | |----------------|------------------------|---------------------------------| | 数组+双指针 | 滑动窗口 | 最长无重复子串 | | 队列 | BFS | 迷宫最短路径 | | 栈 | 单调栈 | 柱状图中最大矩形 | | 并查集 | 连通性判断 | 社交网络中的朋友圈 | | 优先队列 | 贪心算法 | 合并果子最小代价 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值