问题:有n只奶牛排成一列,他们有各自的身高Hi,有Q个区间,分别求出这些区间中最高和最矮的差值。

Sample Input

6 3 (六只奶牛,下面分别是它们的身高,3个区间)
1
7
3
4
2
5
1 5
4 6
2 2
Sample Output

6
3
0

Java代码 复制代码 收藏代码
  1. import java.io.StreamTokenizer;
  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;
  4. import java.io.PrintWriter;
  5. import java.io.OutputStreamWriter;
  6. import java.io.IOException;
  7.  
  8. class tree{ //线段树节点
  9. int left,right,maxvalue,minvalue;
  10. }
  11.  
  12. public class Main{
  13. tree[] tt;//线段树,用数组实现
  14.  
  15. int height[];//奶牛身高
  16.  
  17. public Main(int[] height){
  18. this.height=height;
  19. tt=new tree[131070];
  20. for(int i=0;i<131070;i++)
  21. //数组大小的计算参看:http://128kj.iteye.com/blog/1739064
  22. tt[i]=new tree();
  23. }
  24.  
  25. private void built_tree(int lp,int rp,int pos){ //构建以pos为根的线段树
  26. tt[pos].left=lp;
  27. tt[pos].right=rp;
  28. if(lp==rp){
  29. tt[pos].maxvalue=height[rp];
  30. tt[pos].minvalue=height[lp];
  31. return ;
  32. }
  33. int mid=(tt[pos].left+tt[pos].right)>>1;
  34. built_tree(lp,mid,pos<<1);
  35. built_tree(mid+1,rp,pos<<1|1);
  36. tt[pos].maxvalue=Math.max(tt[pos<<1].maxvalue,tt[pos<<1|1].maxvalue);
  37. tt[pos].minvalue=Math.min(tt[pos<<1].minvalue,tt[pos<<1|1].minvalue);
  38. }
  39.  
  40. //找[lp,rp]上的最大值
  41. private int findmax(int lp,int rp,int pos){
  42. if(tt[pos].left==lp&&tt[pos].right==rp){
  43. return tt[pos].maxvalue;
  44. }
  45.  
  46. int mid=(tt[pos].left+tt[pos].right)>>1;
  47. if(rp<=mid){
  48. return findmax(lp,rp,pos<<1);
  49. }
  50. else if(lp>mid)
  51. return findmax(lp,rp,pos<<1|1);
  52. else{
  53. return Math.max( findmax(lp,mid,pos<<1), findmax(mid+1,rp,pos<<1|1));
  54. }
  55. }
  56.  
  57. //找[lp,rp]上的最小值
  58. private int findmin(int lp,int rp,int pos){
  59. if(tt[pos].left==lp&&tt[pos].right==rp){
  60. return tt[pos].minvalue;
  61. }
  62. int mid=(tt[pos].left+tt[pos].right)>>1;
  63. if(rp<=mid)
  64. return findmin(lp,rp,pos<<1);
  65. else if(lp>mid)
  66. return findmin(lp,rp,pos<<1|1);
  67. else
  68. return Math.min( findmin( lp,mid,pos<<1 ),findmin( mid+1,rp,pos<<1|1 ) );
  69. }
  70.  
  71. public static void main(String args[]) throws IOException{
  72. StreamTokenizer st = new StreamTokenizer(new BufferedReader(
  73. new InputStreamReader(System.in)));
  74. PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
  75.  
  76. while(st.nextToken() != StreamTokenizer.TT_EOF) {
  77.  
  78. int n=(int) st.nval;
  79. st.nextToken();
  80. int q=(int) st.nval;
  81. int[] height=new int[n+1];
  82. for(int i=1;i<=n;++i){
  83. st.nextToken();
  84. height[i]=(int) st.nval;
  85. }
  86.  
  87. Main ma=new Main(height);
  88. ma.built_tree(1,n,1);
  89. int x,y;
  90. while(q-->0){
  91. st.nextToken();
  92. x=(int) st.nval;
  93. st.nextToken();
  94. y=(int) st.nval;
  95. int mmax=ma.findmax(x,y,1);
  96. int mmin=ma.findmin(x,y,1);
  97. System.out.printf("%d\n",mmax-mmin);
  98. }
  99. out.flush();
  100.  
  101. }
  102. }
  103. }