poj 3264-Balanced Lineup解题报告
poj 3264-Balanced Lineup链接:http://poj.org/problem?id=3264
题意说明:有n个数,要求随时统计一定区间上最大值和最小值的差
从题意也能看出来是线段树的问题,节点在建立的时候包括区间的最大值与最小值。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream>
2 #include<stdio.h>
3 #include<string.h>
4 using namespace std;
5 #define N 400005
6 int min(int a,int b)
7 {
8 return a<b?a:b;
9 }
10 int max(int a,int b)
11 {
12 return a>b?a:b;
13 }
14 struct node
15 {
16 int l,r;
17 int min,max;
18 int data;
19 int mid;
20 }tree[N];
21
22 void bulid(int l,int r,int id)
23 {
24 tree[id].l=l;
25 tree[id].r=r;
26 tree[id].max=INT_MAX;
27 tree[id].min=INT_MIN;
28 tree[id].data=0;
29 tree[id].mid=(l+r)>>1;
30 if(l==r)
31 return;
32 bulid(l,tree[id].mid,id<<1);
33 bulid(tree[id].mid+1,r,id<<1|1);
34 }
35 void insert(int l,int r,int data,int id)
36 {
37 if(tree[id].l==l&&tree[id].r==r)
38 {
39 tree[id].data=data;
40 tree[id].max=data;
41 tree[id].min=data;
42 return;
43 }
44 if(r<=tree[id].mid)
45 {
46 insert(l,r,data,id<<1);
47 }
48 else if(l>tree[id].mid)
49 {
50 insert(l,r,data,id<<1|1);
51 }
52 else
53 {
54 insert(l,tree[id].mid,data,id<<1);
55 insert(tree[id].mid+1,r,data,id<<1|1);
56 }
57 tree[id].min=min(tree[id<<1].min,tree[id<<1|1].min);
58 tree[id].max=max(tree[id<<1].max,tree[id<<1|1].max);
59 }
60 int findmin(int l,int r,int id)
61 {
62 if(tree[id].l==l&&tree[id].r==r)
63 return tree[id].min;
64 int a=INT_MAX;
65 int b=INT_MAX;
66 if(r<=tree[id].mid)
67 a=findmin(l,r,id<<1);
68 else if(l>tree[id].mid)
69 b=findmin(l,r,id<<1|1);
70 else
71 {
72 a=findmin(l,tree[id].mid,id<<1);
73 b=findmin(tree[id].mid+1,r,id<<1|1);
74 }
75 return min(a,b);
76 }
77 int findmax(int l,int r,int id)
78 {
79 if(tree[id].l==l&&tree[id].r==r)
80 return tree[id].max;
81 int a=INT_MIN;
82 int b=INT_MIN;
83 if(r<=tree[id].mid)
84 a=findmax(l,r,id<<1);
85 else if(l>tree[id].mid)
86 b=findmax(l,r,id<<1|1);
87 else
88 {
89 a=findmax(l,tree[id].mid,id<<1);
90 b=findmax(tree[id].mid+1,r,id<<1|1);
91 }
92 return max(a,b);
93 }
94 int main()
95 {
96 int n,m;
97 int i;
98 int s,e;
99 while(scanf("%d%d",&n,&m)!=EOF)
100 {
101 bulid(1,n,1);
102 for(i=1;i<=n;i++)
103 {
104 scanf("%d",&s);
105 insert(i,i,s,1);
106 }
107 for(i=0;i<m;i++)
108 {
109 scanf("%d%d",&s,&e);
110 if(s>e)
111 {
112 s^=e;
113 e^=s;
114 s^=e;
115 }
116 int a=findmax(s,e,1);
117 int b=findmin(s,e,1);
118 printf("%d\n",a-b);
119 }
120 }
121 return 0;
122 }