hihocoder1070、1077线段树更新点查询区间

题目链接:http://hihocoder.com/problemset/problem/1070

    http://hihocoder.com/problemset/problem/1077

我的代码:

 1 #include <cstdio>
 2 #include <algorithm>
 3
 4 using namespace std;
 5
 6 #define MAXN 1000005
 7
 8 int w[MAXN];
 9
10 struct segNode
11 {
12     int left, right, minw;
13 };
14
15 struct segTree
16 {
17     segNode t[4*MAXN];
18     void build(int i, int l, int r)
19     {
20         t[i].left = l;
21         t[i].right = r;
22         if(l<r)
23         {
24             int m = (l+r)/2;
25             build(2*i, l, m);
26             build(2*i+1, m+1, r);
27             t[i].minw = min(t[2*i].minw, t[2*i+1].minw);
28         }
29         else t[i].minw = w[l];
30     }
31     int query(int i, int l, int r)
32     {
33         if(t[i].left==l&&t[i].right==r) return t[i].minw;
34         int m = (t[i].left+t[i].right)/2;
35         if(l>m) return query(2*i+1, l, r);
36         if(r<=m) return query(2*i, l, r);
37         return min(query(2*i, l, m), query(2*i+1, m+1, r));
38     }
39     void update(int i, int id, int v)
40     {
41         if(t[i].left==t[i].right) t[i].minw = v;
42         else
43         {
44             int m = (t[i].left+t[i].right)/2;
45             if(id<=m) update(2*i, id, v);
46             else update(2*i+1, id, v);
47             t[i].minw = min(t[2*i].minw, t[2*i+1].minw);
48         }
49     }
50 }tree;
51
52 int main()
53 {
54     int n, q;
55     while(scanf("%d", &n)!=EOF)
56     {
57         for(int i=1; i<=n; ++i) scanf("%d", &w[i]);
58         tree.build(1, 1, n);
59         scanf("%d", &q);
60         while(q--)
61         {
62             int op, a, b;
63             scanf("%d%d%d", &op, &a, &b);
64             if(op)  tree.update(1, a, b);
65             else    printf("%d\n", tree.query(1, a, b));
66         }
67     }
68     return 0;
69 }
时间: 2024-10-16 00:24:47

hihocoder1070、1077线段树更新点查询区间的相关文章

线段树第二弹(区间更新)

上篇文章,我们介绍了线段树的基本概念和单点更新.区间查询,今天,我们来接着上次的线段树问题继续深入研究.在解决线段树问题的过程中,我们会遇到要求修改区间中某一元素值的问题,当然也可能会遇到要求修改一段子区间所有值的问题--即区间更新问题.回忆一下上篇文章单点更新的方法是,由叶节点逐级向上进行更新,此时更新一个节点值的时间复杂度为o(log n),(点击链接了解详情:线段树+RMQ问题第二弹),那么以这样的处理效率来进行区间更新结果会怎样?现在假设待更新区间数据的规模为 n ,那么就需要进行 n

HDU 1556 Color the ball 线段树更新区间查点

点击打开链接 Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9120    Accepted Submission(s): 4665 Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽

hdu4027 Can you answer these queries?(线段树平方减少,区间求和)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4027 Problem Description A lot of battleships of evil are arranged in a line before the battle. Our commander decides to use our secret weapon to eliminate the bat

线段树,最大值查询位子(个人模版)

线段树,最大值查询位子: 1 #include<cstdio> 2 #include<climits> 3 #include<algorithm> 4 5 using namespace std; 6 7 #define lson l, m, rt<<1 8 #define rson m+1, r, (rt<<1)|1 9 10 int tree[111111<<2]; 11 int posn[111111<<2]; 12

hdu 1540 Tunnel Warfare 线段树 单点更新,查询区间长度,区间合并

Tunnel Warfare Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1540 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast areas of north China Plain. Gene

区间最小值(2) (线段树 更新区间)2015年 JXNU_ACS 算法组暑假第一次周赛

区间最小值(2) Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 26   Accepted Submission(s) : 9 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 给定一个数字序列以及一些操作,查询任意给定区间内数字的最小

poj3468 A Simple Problem with Integers(线段树模板 功能:区间增减,区间求和)

转载请注明出处:http://blog.csdn.net/u012860063 Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for th

hdu-1754 I Hate It【线段树】(求区间最大值)

题目链接:https://vjudge.net/contest/182746#problem/A I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)                                                    Total Submission(s): 96252    Accepted Submission(s): 36

HDU5957 Query on a graph(拓扑找环,BFS序,线段树更新,分类讨论)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5957 题意:D(u,v)是节点u和节点v之间的距离,S(u,v)是一系列满足D(u,x)<=k的点的集合,操作1:将S(u,k)内节点权值增加或者减小,操作2:查询S(u,k)内节点的权值和 题解:因为题目说了查询和更新的距离小于等于k,k最大为2,所以很显然要分情况讨论k为0.1.2的情况 因为是多次更新,我们显然是需要用线段树来维护节点权值的 运用线段树和bfs序的知识我们知道 对一个棵树求BFS