记录编号 |
122137 |
评测结果 |
AAAAAAAAAAAAAAAAAA |
题目名称 |
[USACO Jan07] 均衡队形 |
最终得分 |
100 |
用户昵称 |
JSX |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.761 s |
提交时间 |
2014-09-22 17:01:40 |
内存使用 |
29.10 MiB |
显示代码纯文本
- #include<cstdio>
- using namespace std;
-
- int N=0,Q=0;
- int A[200003][20]={0},B[200003][20]={0};
-
- int min(int x,int y){
- if(x<=y) return x;
- return y;
- }
-
- int max(int x,int y){
- if(x<=y) return y;
- return x;
- }
-
- int RMQ1(int l,int r){
- int k=0;
- while(( 1<<(k+1) )<=r-l+1) k++;
- return min(A[l][k],A[r-(1<<k)+1][k]);
- }
-
- int RMQ2(int l,int r){
- int k=0;
- while(( 1<<(k+1) )<=r-l+1) k++;
- return max(B[l][k],B[r-(1<<k)+1][k]);
- }
-
- int main(){
- freopen("lineup.in","r",stdin);
- freopen("lineup.out","w",stdout);
-
- scanf("%d%d",&N,&Q);
- for(int i=1;i<=N;++i){
- scanf("%d",&A[i][0]);
- B[i][0]=A[i][0];
- }
-
- for(int j=1;(1<<j)<=N;++j){
- for(int i=1;i+(1<<j)-1<=N;++i){
- A[i][j]=min(A[i][j-1],A[i+(1<<(j-1))][j-1]);
- }
- }
-
- /*for(int i=1;i<=N;++i){
- for(int j=1;(1<<j)<=N;++j){
- printf("%4d",A[i][j]);
- }
- printf("\n");
- }*/
-
- for(int j=1;(1<<j)<=N;++j){
- for(int i=1;i+(1<<j)-1<=N;++i){
- B[i][j]=max(B[i][j-1],B[i+(1<<(j-1))][j-1]);
- }
- }
-
- /*for(int i=1;i<=N;++i){
- for(int j=1;(1<<j)<=N;++j){
- printf("%4d",B[i][j]);
- }
- printf("\n");
- }*/
-
- int l=0,r=0,t1=0,t2=0;
- for(int i=1;i<=Q;++i){
- scanf("%d%d",&l,&r);
- if(l>r){
- int temp=l;
- l=r;
- r=temp;
- }
- t1=RMQ1(l,r);
- t2=RMQ2(l,r);
- printf("%d\n",t2-t1);
- }
-
-
- return 0;
- }