C+树进阶系列之深入线段树和它的延迟更新 1. 前言 和有相似之处,可以用于解决的问题。 但两者又各个千秋,树状数组本质是数组,有着树的形,可以借用树的一些概念。线段树是典型的二叉树结构,无论神和形都是树,可以应用树的所有理论。 本文将详细聊聊线段树。 2. 问题驱动 与树状数组一样,线段树可以缓存区间内具有...
#include<stdio.h> #define MAX_LEN 1000 void build_tree(int arr[],int tree[],int node,int start,int end) { /* int arr[]: y int tree[]: int node:树
a:b; int tree[100]; int a[100] = {2,5,1,4,9,3}; //创建树 void create(int root, int c[], int start, int end) {//root表示当前线段树下标 //a表示用来构造线段树的数组 //star表示数组起始位置 //end表示数组末尾位置 if (start == end) { //叶子节点 tree[root] = c[start]; ...
算法训练 格子操作(线段树)---C语言—菜鸟级 /*问题描述 有n个格子,从左到右放成一排,编号为1-n。 共有m次操作,有3种操作类型: 1.修改一个格子的权值, 2.求连续一段格子权值和, 3.求连续一段格子的最大值。 对于每个2、3操作输出你所求出的结果。 输入格式 第...
第一行包含3个用空格分开的整数:C、S和R(1≤C≤60000,1≤S≤60000,1≤R≤60000),C为城市个数,S为列车上的座位数,R为所有售票申请总数。 接下来有R行,每行为一个售票申请,用3个空格分开的整数S,D和N表示,S为起始站,D为目的站,N为车票张数(1≤D≤C,1≤S≤C),所有的售票申请按申请的时间从早到...
1 void Update(int L,int C,int l,int r,int rt){//l,r表示当前节点区间,rt表示当前节点编号 2 if(l==r){//到叶节点,修改 3 Sum[rt]+=C; 4 return; 5 } 6 int m=(l+r)>>1; 7 //根据条件判断往左子树调用还是往右 8 if(L <= m) Update(L,C,l,m,rt<<1); 9 else Update(L...
C-拦截导弹 读懂题,这不是线段树的基本操作吗,维护区间最大值即可。 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+10; ll mx[4*N],n,a[N]; inline ll read() { ll x=0,w=1; char c=getchar(); ...
登录-专业IT笔试面试备考平台_牛客网ac.nowcoder.com/acm/contest/26086/C 题意 (这种题目多好啊,直接就复制题干,不需要我在翻译下题意了qwq 思路:很明显我们至少需要一个nlogn的算法,而外层的n的循环应该是遍历 L ,问题是方向。 观察式子,可以发现如果我们从后向前遍历的话,能重复用的信息多。 倒着遍历...
树状数组是一个可以很高效的进行区间统计的数据结构。在思想上类似于线段树,比线段树节省空间,编程复杂度比线段树低,但适用范围比线段树小。以简单的求和为例。设原数组为a[1..N],树状数组为c[1..N],其中c[k] = a[k-(2^t)+1] + ... + a[k]。比如c[6] = a[5] + a[6]。也...