poj2823

典型的线段树,很长时间没有写了,好多次都直接用的是模板,这次自己写了下,多多少少还是出了点问题

 1 #include <iostream>
 2 #include <stdio.h>
 3 using namespace std;
 4 int a[1000005];
 5 int n,k;
 6 struct node
 7 {
 8     int left ;
 9     int right;
10     int max;
11     int min;
12 };
13 node tree[1000005*4];
14 int MIN[1000005],MAX[1000005];
15 
16 int Max(int a,int b)
17 {
18     return a>b?a:b;
19 }
20 
21 int Min(int a,int b)
22 {
23     return a>b?b:a;
24 }
25 void build(int left,int right,int root)
26 {
27     tree[root].left=left;//这个要首先写
28     tree[root].right=right;
29     if(left==right)
30     {
31         tree[root].max=tree[root].min=a[left];
32         return ;
33     }
34     int mid=(left+right)/2;
35     build(left,mid,root*2);
36     build(mid+1,right,root*2+1);
37     tree[root].max=Max(tree[root*2].max,tree[root*2+1].max);
38     tree[root].min=Min(tree[root*2].min,tree[root*2+1].min);
39 }
40 
41 void query(int left,int right, int root, int &min,int &max)
42 {
43     if(tree[root].left==left && tree[root].right==right)
44     {
45         max=tree[root].max;
46         min=tree[root].min;
47         return ;
48     }
49     int mid=(tree[root].left+tree[root].right)/2;//注意这里的mid使用root的left和right来求的
50     if(right<=mid)
51     {
52         query(left,right,root*2,min,max);
53     }
54     else if(left>mid)
55     {
56         query(left,right,root*2+1,min,max);
57     }
58     else
59     {
60         int min1,max1;
61         query(left,mid,root*2,min1,max1);
62         query(mid+1,right,root*2+1,min,max);
63         min=Min(min,min1);
64         max=Max(max,max1);
65     }
66 }
67 
68 int main()
69 {
70     scanf("%d%d",&n,&k);
71     for(int i=1;i<=n;i++)
72     {
73         scanf("%d",&a[i]);
74     }
75     build(1,n,1);
76     for(int i=1;i<=n-k+1;i++)
77     {
78         query(i,i+k-1,1,MIN[i],MAX[i]);
79     }
80     for(int i=1;i<=n-k+1;i++)
81     {
82         printf("%d ",MIN[i]);
83     }
84     printf("\n");
85     for(int i=1;i<=n-k+1;i++)
86     {
87         printf("%d ",MAX[i] );
88     }
89     printf("\n");
90     return 0;
91 }

由于poj测评系统服务器坏了,这题目前还木有提交,不过我感觉应该可以过,上面标注释的地方是我写错的地方

posted on 2012-08-19 19:27  矮人狙击手!  阅读(727)  评论(0编辑  收藏  举报

导航