首页 > 其他分享 >计蒜客:斑点蛇(线段树)

计蒜客:斑点蛇(线段树)

时间:2024-10-15 20:14:19浏览次数:5  
标签:10 斑点 res 线段 mid int str Query 计蒜客

 样例输入

 

10
1 2 3 4 5 6 7 8 9 10
Query 1 3
Add 3 6
Query 2 7
Sub 10 2
Add 6 3
Query 3 10
End

 

 样例输出

 

6
33
59

采用标准模板即可。注意线段树的节点个数一般为其范围的4倍。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 vector<int> s(50000 * 4);
 4 int n;
 5 void modify(int p, int l, int r, int x, int y) {
 6     s[p] += y;
 7     if (l == r) { //到达叶子节点
 8         return;
 9     }
10     int mid = (l + r) / 2; 
11     if (x <= mid) {
12         modify(p * 2, l, mid, x, y);
13     } else {
14         modify(p * 2 + 1, mid + 1, r, x, y);
15     }
16 }
17 int query(int p, int l, int r, int x, int y) {
18     if (x <= l && y >= r) {
19         return s[p];
20     }
21     int mid = (l + r) / 2, res = 0;
22     if (x <= mid) {
23         res += query(p * 2, l, mid, x, y);
24     }
25     if (y > mid) {
26         res += query(p * 2 + 1, mid + 1, r, x, y);
27     }
28     return res;
29 }
30 
31 int main() {
32     cin >> n;
33     int temp;
34     for (int i = 1; i <= n; ++i) {
35         cin >> temp;
36         modify(1, 1, n, i, temp);
37     }
38     string str;
39     int i, j;
40     while (cin >> str && str != "End") {
41         cin >> i >> j;
42         if (str == "Query") {
43             cout << query(1, 1, n, i, j) << endl;
44         }else if (str == "Add") {
45             modify(1, 1, n, i, j);
46         }else {
47             modify(1, 1, n, i, -j);
48         }
49     }
50 }

 

标签:10,斑点,res,线段,mid,int,str,Query,计蒜客
From: https://www.cnblogs.com/coderhrz/p/18468329

相关文章

  • 【分治】线段树 SegmentTree
    算法描述线段树是一种能够处理区间修改和区间查询的数据结构。顾名思义,线段树就是一种存储着线段数据的树形结构。它的每个节点都表示一个线段区间,每个节点的孩子节点存储的就是该区间的左半段和右半段。每个线段区间都存储着一个值,一般是区间和,也有可能是区间最大/最小值。......
  • 线段树(超详解)
    线段树(超详解)Author:铜陵一中缪语博在网上看了几个讲线段树的,都感觉不咋地,自己琢磨了几天,大致弄明白了。于是趁兴写了一篇关于线段树的文章,希望拯救那些看oi−......
  • 线段树分治略解&杂题解析
    可能做到好题之后会再更新吧。总叙线段树与离线询问结合技巧又被称为线段树分治。使用线段树分治维护的信息通常会在某一个时间段内出现,要求在离线的前提下回答某一个时刻的信息并,则可以考虑使用线段树分治的技巧。以下是线段树分治的基本模板:change将信息按时间段覆盖在线......
  • 浅谈李超线段树
    众所周知,\(Li\Chao\Tree=LCT=Link\Cut\Tree\)。在我们的日常学习生活中,经常会遇到以下问题:维护一种数据结构,要求:添加一条线段求解\(x=k\)与所有线段交点中,\(y\)最大的一个。众所周知,线段会影响一个区间的答案。区间取\(max+\)单点最大值,想到线段树。但是该怎......
  • 浅谈一类动态开点线段树优化 - DEST树
    前言线段树,是一种优秀的数据结构,其应用极为广泛。其中,动态开点值域线段树,配合上线段树合并,甚至能替代或超越平衡树。但是,这种线段树的树高与值域相关,很容易产生四五倍常数。无论考虑时间或空间复杂度,这样的树都不算优。那么,我们是否能想办法优化它呢?优化思想正如上文所述,普通线......
  • 可持久化线段树
    可持久化线段树P3919【模板】可持久化线段树1(可持久化数组)维护一个长度为\(N\)的数组,支持如下几种操作在某个历史版本上修改某一个位置上的值访问某个历史版本上的某一位置的值此外,每进行一次操作(对于操作2,即为生成一个完全一样的版本,不作任何改动),就会生成一个新......
  • 李超线段树
    1问题李超线段树是线段树的一种变种,主要用于维护二维平面上的直线信息以及查询操作。它的应用范围很广,只要式子的形式能转化为一次函数就可以考虑使用李超线段树进行求解/优化。具体的,李超线段树支持下面两种操作:动态在平面中插入一条线段/直线。在平面上询问与一条直线......
  • 李超线段树
    最经典应用就是维护一个二维平面直角坐标系,支持动态插入线段(理解为有值域的一次函数\(y=kx+b\)),询问已插入线段与直线\(x=x_0\)交点的纵坐标最值。即当\(x=x_0\),求\(max\)或\(min\){\(k_ix+b_i\)}对于普通求法的\(O(n)\)遍历,如何优化时间复杂度呢?其实就是找一种方......
  • B. 线段取交
    题目下载链接算法可以发现是求逆序对时间复杂度限制在\(O(n\logn)\)树状数组记录每一个值的多少转化为求前缀和#include<iostream>#include<cstdio>#include<algorithm>usingnamespacestd;inttree[500010],ranks[500010],n;longlongans;structpoint{......
  • 2024.10.1 总结(集训;数据结构 主要是线段树)
    XK又来给我们讲课了。开心!1.Baka'sTrick两种理解:双栈模拟队列。[找到若干个划分点,使得每个区间包含恰好一个划分点。维护划分点到划分点段的前缀、后缀信息。在在线的实现中,在队列中维护仅仅一个划分点,维护它到前面每个点和它到后面每个点的信息。当这个划分点出队时,把队......