首页 > 其他分享 >计蒜客:最甜的苹果(线段树)

计蒜客:最甜的苹果(线段树)

时间:2024-10-29 21:11:17浏览次数:2  
标签:right int 线段 mid 区间 operation 计蒜客 节点 最甜

 样例输入

5 6
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 2 9
Q 1 5

样例输出

5
6
5
9

 

这题我们需要维护的信息,从区间的和变成了区间内的最大值。现在区间的内的某个值可能增大可能减小,若从上到下(从根到叶)进行节点更新,我们无法直接判断目前区间内的最大的节点。

所以维护区间最大/最小值和维护区间和最大的不同就是:我们只能从下到上(从叶到根)进行节点更新。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 vector<int> maximum(200000 * 4);
 4 void modify(int p, int left, int right, int x, int y){
 5     if (left == right) {
 6         maximum[p] = y; //更新叶节点
 7         return;
 8     }
 9     int mid = (left + right) / 2;
10     if (x <= mid) {
11         modify(p * 2, left, mid, x, y);
12     } else {
13         modify(p * 2 + 1, mid + 1, right, x, y);
14     }
15     maximum[p] = max(maximum[p * 2], maximum[p * 2 + 1]); //叶节点更新完成后再更新最大值
16 }
17 int query(int p, int left, int right, int x, int y){
18     if (left >= x && right <= y){
19         return maximum[p];
20     }
21     int mid = (left + right) / 2, res, res1 = 0, res2 = 0;
22     if (x <= mid){
23         res1 = query(p * 2, left, mid, x, y);
24     }
25     if (y > mid){
26         res2 = query(p * 2 + 1, mid + 1, right, x, y);
27     }
28     return res = max(res1, res2);
29 }
30 int main(){
31     int n, m;
32     cin >> n >> m;
33     int temp, x, y;
34     char operation;
35     for (int i = 1; i <= n; ++i) {
36         cin >> temp;
37         modify(1, 1, n, i, temp);
38     }
39     while (m--) {
40         cin >> operation >> x >> y;
41         if (operation == 'Q') {
42             cout << query(1, 1, n, x, y) << endl;
43         } else {
44             modify(1, 1, n, x, y);
45         }
46     }
47 }

 

标签:right,int,线段,mid,区间,operation,计蒜客,节点,最甜
From: https://www.cnblogs.com/coderhrz/p/18514488

相关文章

  • 题解:P3352 [ZJOI2016] 线段树
    首先,题目上说让期望乘上\((\frac{n(n+1)}{2})^q\)的目的就是让我们求方案数与值的乘积。然后我们考虑在操作过后一个位置上的值相对于原来的值肯定是不降的,于是可以想到对每一个值\(v\),原序列中所有\(\lev\)的元素一定构成了若干连续的区间。对每一个这样的区间而言,操作过......
  • P2839 [国家集训队] middle(二分+可持久化线段树)
    P2839[国家集训队]middle二分+可持久化线段树中位数经典做法,二分答案,将小于的部分看做\(-1\),大于等于的部分看做\(+1\),那么答案可以更大的条件就是区间和大于等于\(0\)(等于\(0\)可不可以取到看是下取整还是上取整,本题是上取整)。那么问题就是怎么判断有没有这样一个区间......
  • 新高一暑假第一期集训恢复性训练【数据结构-线段树晚测】(补)
    新高一暑假第一期集训恢复性训练【数据结构-线段树晚测】(补)A.[CF1045G]AIrobots我们先按视野降序排序,这样一个一个考虑,如果后面的能看到前面,那前面的也肯定能看到后面。这样,就是对于每一个机器人,在他前面有几个智商在\([q-k,q+k]\),位置在\([x-r,x+r]\)。那么把这个东......
  • 线段树初步理解
    今天ZRtes爆零咯,就不在tes里写了引言:以前一直只会用线段树2,线段树也是一直当做工具使用,一切线段树的科技除了线段树分治基本都不会,因此特作此文记之线段树的lazytag与pushdown为了保证时间复杂度,线段树在做区间修改的时候引入了lazytag的概念,目的是为了节省没必要的时......
  • 线段树?Lazytag?
    本文导读:本博客主要介绍了线段树的原理和构造的过程,以及一些例题,如果有不足的点,欢迎指出qwq.线段树\((1)_{36}\):什么是线段树?作为一个蒟蒻qwq,看到"线段树"三个字时,你想到了什么?蒟蒻:我知道!不就是"线段+树"吗!......作者:哎呀,你到底在说什么,还是我来解释吧...1.线段树......
  • zkw 线段树学习笔记
    一、简介zkw线段树专门用于线段树卡常,同时码量比普通线段树要小。原理是通过将线段树补成完全二叉树,直接找到第\(i\)个叶子节点(编号为\(p+i\)),然后从下往上更新,从而避免递归。这里常数p=1<<(__lg(n)+1),编号为\(p\)和\(p+n+1\)的叶子为虚点,编号为\(p+1\simp+n\)的......
  • [ABC337G] Tree Inversion(换根 dp + 值域线段树)
    link题目形式就很换根dp如果这种题用朴素的做法求,就是暴力以每个点都做一次根跑树,自底向上统计,时间是\(O(n^2)\)而换根dp的思想就是分两步,一般先钦定某个点(如1)为根,统计一遍以1为根时的结果,然后挖掘如果以其他点为根时,变换对结果的影响,一般就是自顶向下更新如果换根后......
  • P4344 [SHOI2015] 脑洞治疗仪——线段树
    [SHOI2015]脑洞治疗仪题目描述曾经发明了自动刷题机的发明家SHTSC又公开了他的新发明:脑洞治疗仪——一种可以治疗他因为发明而日益增大的脑洞的神秘装置。为了简单起见,我们将大脑视作一个01序列。\(1\)代表这个位置的脑组织正常工作,\(0\)代表这是一块脑洞。10......
  • P11217 【MX-S4-T1】「yyOI R2」youyou 的垃圾桶(线段树上二分)
    link赛时是想到普通的线段树+二分\(O(q\log^2n)\),预期是70pts,实际50pts后面发现又是在longlong类型的计算中,1ll写成了1,然后爆负数,复杂度就错了,T了四个点开题,读起来是一个很套路的题目要对区间在线修改,区间加、(区间乘?),发现数据很大,那就是线段树、树状数组维护了思......
  • 李超线段树
    李超线段树最基础的李超线段树可以做下面的问题:每次插入若干条直线\(y=k_ix+b_i\),查询某个位置\(x_i\)上的最值。考虑一棵线段树结构,在每个节点维护在当前区间中点上的最优直线,当插入一条新直线时:如果该节点为空就把新直线存到当前节点并返回。否则如果新直线在中点处......