1 solutions
-
0
C :
# include<stdio.h> # include<string.h> int main() { int a[100],N,M,i,m,n,max,min,d; scanf("%d%d",&N,&M); for(i=1;i<=N;i++) scanf("%d",&a[i]); while(M--) { max=-1; min=1000000000; scanf("%d%d",&m,&n); for(i=m;i<=n;i++) { if(a[i]>max) max=a[i]; if(a[i]<min) min=a[i]; } d=max-min; printf("%d\n",d); } return 0; }C++ :
#include <iostream> #include <cmath> #include <cstdio> using namespace std; const int N=100005; int minsum[N][21],maxsum[N][21]; // f(i,j)表示i~i+(2^j)-1中最大或者最小值; //f(i,j)=max(f(i,j-1),f(i+2^(j-1),j-1) void RMQ(int n) { for(int j=1;j<=20;j++) for(int i=1;i<=n;i++) { if(i+(1<<(j-1))<=n) { maxsum[i][j]=max(maxsum[i][j-1],maxsum[i+(1<<(j-1))][j-1]); minsum[i][j]=min(minsum[i][j-1],minsum[i+(1<<(j-1))][j-1]); } } } int main() { int n,m,i,j,k,maxans,minans; cin>>n>>m; for(i=1;i<=n;i++) { scanf("%d",&maxsum[i][0]); minsum[i][0]=maxsum[i][0]; } RMQ(n); while(m--) { scanf("%d%d",&i,&j); //我们可以取k=log2( j - i + 1),则有: //i~j的最大值=max{F[i , k], F[ j - 2 ^ k + 1, k]}。 k=log10(j-i+1.0)/log10(2.0); maxans=max(maxsum[i][k],maxsum[j-(1<<k)+1][k]); minans=min(minsum[i][k],minsum[j-(1<<k)+1][k]); printf("%d\n",maxans-minans); } return 0; }Java :
import java.util.*; public class Main { public static void main(String[] args) { Scanner input=new Scanner(System.in); int max=0,min=100000000; int n=input.nextInt(); int m=input.nextInt(); int a[]=new int[n]; int b[]=new int[m]; int c[]=new int[m]; int ans[]=new int[m]; for(int i=0;i<n;i++) { a[i]=input.nextInt(); } for(int i=0;i<m;i++) { b[i]=input.nextInt(); c[i]=input.nextInt(); } for(int i=0;i<m;i++) { int d=b[i]; int e=c[i]; for(int j=d;j<=e;j++) { if(max<a[j-1]) { max=a[j-1]; } if(min>a[j-1]) { min=a[j-1]; } } ans[i]=max-min; max=0; min=100000000; } for(int i=0;i<m;i++) { System.out.println(ans[i]); } input.close(); } }
Information
- ID
- 20235
- Time
- 2000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By