hicocoder1068 区间最值询问(线段树)

题目链接:

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

我的代码:

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

需要注意的是:涉及到频繁的输入输出,最好用C语言的标准输入输出而不要用C++的流式输入输出,否则提交很可能会超时。(我一开始用cin, cout就超时了T^T)。

时间: 2024-12-25 05:04:09

hicocoder1068 区间最值询问(线段树)的相关文章

【bzoj3685】普通van Emde Boas树 权值zkw线段树

原文地址:http://www.cnblogs.com/GXZlegend/p/6809743.html 题目描述 设计数据结构支持:1 x  若x不存在,插入x2 x  若x存在,删除x3    输出当前最小值,若不存在输出-14    输出当前最大值,若不存在输出-15 x  输出x的前驱,若不存在输出-16 x  输出x的后继,若不存在输出-17 x  若x存在,输出1,否则输出-1 输入 第一行给出n,m 表示出现数的范围和操作个数接下来m行给出操作n<=10^6,m<=2*10^6,

luogu3373线段树2..支持区间加值和乘值的线段树

这道题调了2个多小时发现有个地方模运算符号弄错了... 题面:luogu3373 和线段树1一样,这道题也要用Lazy标记思想,这个很好理解. 不过重点在更新的顺序上面: 因为乘法优先,所以每次执行PushDown操作时要先算乘法. 再就是注意到对于乘法的标记,每次要更新的不仅是乘法的,还有加法的标记. 另外,一定要注意模运算的符号!!! 点我看代码 #include <cstdio> using namespace std; typedef long long ll; const int M

ZOJ2112 动态区间Kth(单点修改) 线段树+Treap写法

---恢复内容开始--- 题意:给出一个序列和操作次数, 每次操作修改一个位置的数 或者 询问一个区间第k小的数 分析:单点修改可以考虑线段树, 区间排名可以用平衡树 所以线段树+Treap 用一颗线段树将序列划分 每颗Treap中插入的是对应区间的数 在每个数加入时, 顺便将该数插入线段树中包含该位置的那些区间上的Treap即可 单点修改同理, 将所有包含要修改的位置的区间上的Treap都删去原数并插入新数 询问第k小的数:由于询问的区间不一定恰好对应某棵Treap, 不便直接求出名次, 但是

HDU 1754 - I Hate It &amp; UVA 12299 - RMQ with Shifts - [单点/区间修改、区间查询线段树]

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师

敌兵布阵_区间求和问题_线段树 or 树状数组

敌兵布阵 TimeLimit: 2000/1000 MS (Java/Others)  MemoryLimit: 65536/32768 K (Java/Others) 64-bit integer IO format:%I64d Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于采取了某种先进的监测手段,所

区间的价值(线段树)百度之星

区间的价值 Accepts: 0 Submissions: 0 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 我们定义“区间的价值”为一段区间的最大值*最小值. 一个区间左端点在LLL,右端点在RRR,那么该区间的长度为(R−L+1)(R-L+1)(R−L+1). 现在聪明的杰西想要知道,对于长度为kkk的区间,最大价值的区间价值是多少.

Codeforces 487B. Strip(求区间最值+线段树上的dp)

B. Strip time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Alexandra has a paper strip with n numbers on it. Let's call them ai from left to right. Now Alexandra wants to split it into some p

HDU 3333 Turing Tree (离线询问+线段树)

题目地址:HDU 3333 将询问离线保存下来,然后将数组的点离散化,记录每个值上一次出现的位置.然后枚举数组的数,若当前枚举的数前面出现过,那么就删掉前面出现过的那个位置上的数,更新当前这个位置上的数,然后那些所有询问的右端点为当前位置的就可以通过查询来得到结果了. 更新与查询用线段树来优化. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #

codedecision P1112 区间连续段 题解 线段树

题目描述:https://www.cnblogs.com/problems/p/P1112.html 题目链接:http://codedecision.com/problem/1112 线段树区间操作,每一个线段对应的点包含三个信息: \(l\):表示这个区间最左边的点的数值: \(r\):表示这个区间最右边的点的数值: \(cnt\):表示这个区间有多少个数值段. 合并的时候: 根节点的 \(l\) 值等于左儿子节点的 \(l\) 值: 根节点的 \(r\) 值等于右儿子节点的 \(r\) 值