线段树 建树、查询、单点更新

 1 #include<stdio.h>
 2 int n, m;
 3 int a[10];
 4 int tree[6<<2];
 5
 6 int minx(int a, int b)
 7 {
 8     return a<b?a:b;
 9 }
10
11 void build(int rt, int l, int r)
12 {
13     if(l==r)
14     {
15         tree[rt]=a[l];
16     }
17     else
18     {
19         int m=(l+r)>>1;
20         build(rt<<1, l, m);
21         build((rt<<1)+1, m+1, r);
22
23         tree[rt]=minx(tree[rt<<1], tree[(rt<<1)+1]);
24     }
25 }
26
27 int query(int rt, int l, int r, int a, int b)
28 {
29     if(a<=l && b>=r)
30         return tree[rt];
31     if(a>r || b<l)
32         return -1;
33     int m=(l+r)>>1;
34     int x=query(rt<<1, l, m, a, b);
35     int y=query((rt<<1)+1, m+1, r, a, b);
36     if(x==-1)
37         return y;
38     if(y==-1)
39         return x;
40     if(x<=y)
41         return x;
42     return y;
43 }
44
45 void updata(int rt, int l, int r, int a, int b)
46 {
47     if(l==r)
48     {
49         tree[rt]=b;
50     }
51     else
52     {
53         int m=(l+r)>>1;
54         if(a<=m)
55             updata(rt<<1, l, m, a, b);
56         else
57             updata((rt<<1)+1, m+1, r, a, b);
58         tree[rt]=minx(tree[rt<<1], tree[(rt<<1)+1]);
59     }
60 }
61
62 int main()
63 {
64     while(scanf("%d%d", &n, &m)==2)
65     {
66         for(int i=1; i<=n; i++)
67             scanf("%d", &a[i]);
68         build(1, 1, n);
69
70         for(int j=0; j<m; j++)
71         {
72             char x;
73             int a, b;
74             getchar();
75             scanf("%c%d%d", &x, &a, &b);
76             if(x==‘Q‘)
77                 printf("%d\n", query(1, 1, n, a, b));
78             else
79                 updata(1, 1, n, a, b);
80         }
81     }
82     return 0;
83 }

http://blog.csdn.net/metalseed/article/details/8039326#

借来
时间: 2024-10-06 03:14:26

线段树 建树、查询、单点更新的相关文章

hdu 4893 Wow! Such Sequence!(线段树功能:单点更新,区间更新相邻较小斐波那契数)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4893 --------------------------------------------------------------------------------------------------------------------------------------------

POJ2886 Who Gets the Most Candies? 【线段树】+【单点更新】+【模拟】+【反素数】

Who Gets the Most Candies? Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 9416   Accepted: 2868 Case Time Limit: 2000MS Description N children are sitting in a circle to play a game. The children are numbered from 1 to N in clockwise o

HDU2795 Billboard 【线段树】+【单点更新】

Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9632    Accepted Submission(s): 4286 Problem Description At the entrance to the university, there is a huge rectangular billboard of s

POJ2828 Buy Tickets 【线段树】+【单点更新】+【逆序】

Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 12296   Accepted: 6071 Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get up early and join a long queue- The Lunar New Year wa

hdu 1116 敌兵布阵 线段树 区间求和 单点更新

线段树的基本知识可以先google一下,不是很难理解 线段树功能:update:单点增减 query:区间求和 #include <bits/stdc++.h> #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 using namespace std; const int MAXN = 50008; int sum[MAXN<<2]; void build(int l, int r, int rt)

HDU(1166),线段树模板,单点更新,区间总和

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 第一次做线段树,帆哥的一句话,我记下来了,其实,线段树就是一种处理数据查询和更新的手段. 然后,我的代码风格,是网上的大牛们的辛苦总结,我就套用了.这里,我还是简单说一下线段树,说的不好,主要方便自己复习. 线段树,3个步骤,建树,查询,更新, 建树:到底部就是a[]数组的值,建立左右子树后,向上推根,根为左右子树的值 更新:类似建树,二分,找到单点所在区间,更新该区间,记得上一个区间也要变化

线段树入门之单点更新

作者:zifeiy 标签:线段树 单点更新 :最最基础的线段树,只更新叶子节点,然后把信息用 push_up(int rt) 这个函数更新上来 HDU1166 敌兵布阵 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 线段树功能: update:单点增减: query:区间求和 #include <bits/stdc++.h> using namespace std; #define lson l, m, rt<<1 #def

nyoj 119 士兵杀敌(三) 【线段树】【单点更新】

题意:... 策略如题. 思路:我们先假设只求某一区间的最大值,我们只需要利用线段树的模板,只需要初始化和询问的时候小小的修改一下,改成祖先结点储存的不再是子节点的和而是两个子节点之间的最大值,这样我们可以求出最大值了,最小值也是这样求. 注意:因为询问的时候既要求最大值又要求最小值,所以要返回结构体. 代码: #include <stdio.h> #include <string.h> #define M 100005 struct node{ int left, right;

hdu 1754 线段树 水题 单点更新 区间查询

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 59558    Accepted Submission(s): 23201 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要

HDU 1394:Minimum Inversion Number(线段树区间求和单点更新)

http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number Problem Description The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that satisfy i < j and ai > aj. For a given sequence of numbe