poj 3264(线段树)

http://poj.org/problem?id=3264

初学线段可以做的水题,也是线段树的基础运用。也是我的第一个线段树的题。

题意:在区间范围内的最大值减去最小值

思路:线段树记录下每个区间内的最大值以及最小值,然后查询。

我也是第一次做,然后耗时比较多。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define maxn 500500
 4
 5 int max(int x,int y)
 6 {
 7     return x > y? x : y ;
 8 }
 9 int min(int x,int y)
10 {
11     return x > y? y : x;
12 }
13
14 struct note{
15
16     int Min,Max;
17
18 }segtree[ maxn * 2];
19
20 int arra[ maxn ];
21
22
23 void build(int root , int arr[] , int instart , int iend)
24 {
25     if(instart == iend)
26     {
27       //  segtree[ root ].val = arr[ instart ];
28         segtree[ root ].Max = arr[ instart ];
29         segtree[ root ].Min = arr[ instart ];
30     }
31     else
32     {
33         int mid = (instart+iend)/2;
34         build( root * 2 , arr , instart , mid );
35         build( root * 2 + 1 , arr , mid + 1 , iend );
36         segtree[ root ].Max = max(segtree[ root * 2 ].Max,segtree[ root * 2 + 1 ].Max);
37         segtree[ root ].Min = min(segtree[ root * 2 ].Min,segtree[ root * 2 + 1 ].Min);
38     }
39 }
40
41 int remin(int root ,int nstart , int nend , int qstart , int qend)
42 {
43     if(qstart > nend || qend < nstart)
44         return maxn*10;
45     if( qstart <= nstart && qend >= nend )
46         return segtree[ root ].Min;
47     int mid =( nstart + nend ) / 2;
48     return min(remin(root * 2,nstart,mid,qstart,qend),
49                remin(root * 2 + 1 , mid + 1 , nend , qstart , qend ));
50 }
51 int reMax(int root , int nstart , int nend , int qstart , int qend)
52 {
53     if(qstart > nend || qend < nstart)
54         return 0;
55     if(qstart <= nstart && qend >= nend )
56         return segtree [ root ].Max;
57     int mid = ( nstart + nend ) / 2;
58     return max(reMax(root * 2, nstart , mid , qstart , qend ),
59                reMax(root * 2 + 1 , mid + 1 , nend , qstart , qend ) );
60 }
61
62 int main()
63 {
64   //  freopen("in.txt","r",stdin);
65     int m,n,a,b,ma,mi;
66     scanf("%d%d",&m,&n);
67     for( int i = 1 ; i <= m ; i++ )
68         scanf("%d",&arra[ i ]);
69     build(1,arra,1,m);
70     while(n--)
71     {
72         scanf("%d%d",&a,&b);
73         ma = reMax(1,1,m,a,b);
74         mi = remin(1,1,m,a,b);
75         printf("%d\n",ma-mi);
76     }
77     return 0;
78 }
时间: 2024-11-03 22:01:54

poj 3264(线段树)的相关文章

poj 3264 线段树

线段树太弱了,题目逼格一高连代码都读不懂,今天开始重刷线段树,每天一题,风格用kuangbin大神和以前的,两种都写一遍 RMQ做法:poj3264 1 /* 2 POJ 3264 Balanced Lineup 3 题目意思:给定Q(1<=Q<=200000)个数A1,A2,```,AQ, 4 多次求任一区间Ai-Aj中最大数和最小数的差 5 */ 6 #include<stdio.h> 7 #include<algorithm> 8 #include<iost

POJ&mdash;&mdash;3264线段树

题目: 输入两个数(m,n),m表示牛的头数,n表示查询的个数.查询时输入两个数(x,y),表示查询范围的起始值和终止值,查询结果是,这个区间内牛重量的最大值减去牛重量的最小值,数量级为1000,000 设计每次查询的复杂度为logm. 例如, 输入: 6 3 1 7 3 4 2 5 1 5 4 6 2 2 输出: 6 3 0     分析:这道题是典型的空间换时间的题.一看到是区间的查找,我们应该想到线段树,这里有一篇我觉得写得挺好的介绍线段树的博客和大家分享一下:http://www.cnb

POJ - 3264(线段树实现)

题目:poj.org/problem?id=3264 题意:求一段区间内最大值与最小值的差. 看到区间最值首先想到RMQ--ST算法.但本题出现在了kuangbin专题的线段树里. 用线段树也无思维难点,但有两个坑: 1. 查询函数中,区间不包含时的返回值. 2.用cin,cout会TLE.用c的输入方式. 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<string&g

poj 3264 线段树 求区间最大最小值

Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to organize a game of Ultimate Frisbee with some of the cows. To keep things simple, he will take a contiguous rang

G - Balanced Lineup POJ 3264 (线段树+区间查询无更新)

G - Balanced Lineup Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3264 Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John de

POJ 3264 线段树+二分

Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to organize a game of Ultimate Frisbee with some of the cows. To keep things simple, he will take a contiguous rang

POJ 3264 线段树模板题

之前做的那道是区间求和的,这道题是求区间最大值和最小值之差的,感觉这道题更简单.只需在插入时把每个区间的最大值最小值求出来保存在根节点上就可以啦~\(^o^)/ Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 39475   Accepted: 18524 Case Time Limit: 2000MS Description For the daily milking, Farmer Jo

POJ 2528 (线段树+离散化) Mayor&#39;s posters

因为将每个单位都作为一个最小单元的话会爆内存的 所以,将海报的每个端点进行排序,将这些端点最为最小的区间. 毕竟是刚刚接触线段树,理解起来还有些吃力,还是那句话,题做多了慢慢就好了. 萌萌的AC代码君贴上. 1 //#define LOCAL 2 #include <iostream> 3 #include <algorithm> 4 #include <cmath> 5 using namespace std; 6 7 int n; 8 struct CPost 9

poj 2777 线段树的区间更新

Count Color Time Limit: 1000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main [Submit] [Status] [Discuss] Description Chosen Problem Solving and Program design as an optional course, you are required to solve al

转载::POJ 2991 线段树+计算几何(有c++结构体操作)

POJ 2991 线段树+计算几何 (2011-02-27 21:13:44) 转载▼ 标签: 杂谈 分类: OI 话说这一题真的是很恶心很恶心,不过确实改变了我对线段树的一些看法,算是很经典的题目. 题意:有一个吊车由很多个不同长度的线段组成,一开始是一条长直线起点在(0,0),尾节点在(0,sum[n]),每条线段之间的夹角的初始值是180度.然后有一些操作a. b将第a条线段和a+1之间的夹角变成b度,经过每一次操作都要求出尾节点的坐标. 首先要用到一个计算几何的知识(没学过..请教而来)