记录编号 122137 评测结果 AAAAAAAAAAAAAAAAAA
题目名称 [USACO Jan07] 均衡队形 最终得分 100
用户昵称 GravatarJSX 是否通过 通过
代码语言 C++ 运行时间 0.761 s
提交时间 2014-09-22 17:01:40 内存使用 29.10 MiB
显示代码纯文本
  1. #include<cstdio>
  2. using namespace std;
  3.  
  4. int N=0,Q=0;
  5. int A[200003][20]={0},B[200003][20]={0};
  6.  
  7. int min(int x,int y){
  8. if(x<=y) return x;
  9. return y;
  10. }
  11.  
  12. int max(int x,int y){
  13. if(x<=y) return y;
  14. return x;
  15. }
  16.  
  17. int RMQ1(int l,int r){
  18. int k=0;
  19. while(( 1<<(k+1) )<=r-l+1) k++;
  20. return min(A[l][k],A[r-(1<<k)+1][k]);
  21. }
  22.  
  23. int RMQ2(int l,int r){
  24. int k=0;
  25. while(( 1<<(k+1) )<=r-l+1) k++;
  26. return max(B[l][k],B[r-(1<<k)+1][k]);
  27. }
  28.  
  29. int main(){
  30. freopen("lineup.in","r",stdin);
  31. freopen("lineup.out","w",stdout);
  32. scanf("%d%d",&N,&Q);
  33. for(int i=1;i<=N;++i){
  34. scanf("%d",&A[i][0]);
  35. B[i][0]=A[i][0];
  36. }
  37. for(int j=1;(1<<j)<=N;++j){
  38. for(int i=1;i+(1<<j)-1<=N;++i){
  39. A[i][j]=min(A[i][j-1],A[i+(1<<(j-1))][j-1]);
  40. }
  41. }
  42. /*for(int i=1;i<=N;++i){
  43. for(int j=1;(1<<j)<=N;++j){
  44. printf("%4d",A[i][j]);
  45. }
  46. printf("\n");
  47. }*/
  48. for(int j=1;(1<<j)<=N;++j){
  49. for(int i=1;i+(1<<j)-1<=N;++i){
  50. B[i][j]=max(B[i][j-1],B[i+(1<<(j-1))][j-1]);
  51. }
  52. }
  53. /*for(int i=1;i<=N;++i){
  54. for(int j=1;(1<<j)<=N;++j){
  55. printf("%4d",B[i][j]);
  56. }
  57. printf("\n");
  58. }*/
  59. int l=0,r=0,t1=0,t2=0;
  60. for(int i=1;i<=Q;++i){
  61. scanf("%d%d",&l,&r);
  62. if(l>r){
  63. int temp=l;
  64. l=r;
  65. r=temp;
  66. }
  67. t1=RMQ1(l,r);
  68. t2=RMQ2(l,r);
  69. printf("%d\n",t2-t1);
  70. }
  71. return 0;
  72. }