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测评系统服务器坏了,这题目前还木有提交,不过我感觉应该可以过,上面标注释的地方是我写错的地方