一看就是 十分简单的 题 , 然后上去开始无脑程序
超时~~~ 感觉时间复杂度 , 已经很低了 , 但是并没有什么卵用 .
1 #include<stdio.h>
2 #include<string.h>
3 #include<math.h>
4 #include<iostream>
5 #include<algorithm>
6 #include<queue>
7 #include<vector>
8 #include<set>
9 #include<stack>
10 #include<string>
11 #include<sstream>
12 #include<map>
13 #include<cctype>
14 #include<limits.h>
15 using namespace std;
16 int main()
17 {
18 int w,q,a[100000],n,m;
19 scanf("%d%d",&w,&q);
20 for(int i=1;i<=w;i++)
21 scanf("%d",&a[i]);
22 for(int i=0;i<q;i++)
23 {
24 int maxn=INT_MIN,minn=INT_MAX;
25 scanf("%d%d",&n,&m);
26 for(int j=n;j<=m;j++)
27 {
28 maxn=maxn>a[j]?maxn:a[j];
29 minn=minn<a[j]?minn:a[j];
30 }
31 printf("%d
",maxn-minn);
32 }
33 return 0;
34 }
两个程序的时间复杂度
1 #include<stdio.h>
2 #include<string.h>
3 #include<math.h>
4 #include<iostream>
5 #include<algorithm>
6 #include<queue>
7 #include<vector>
8 #include<set>
9 #include<stack>
10 #include<string>
11 #include<sstream>
12 #include<map>
13 #include<cctype>
14 #include<limits.h>
15 using namespace std;
16 int dp_max[100005][17];
17 int dp_min[100005][17];
18 void RMQ(int n)
19 {
20 for(int j = 1; j < 17; j++) // 这里 为啥 是 20 呢 ? //F[i, j]表示从第i个数起连续2^j个数中的最大值。(DP的状态) ???
21 {
22 for(int i = 1; i <= n; i++)
23 {
24 if( i + (1<<j)-1 <= n)
25 {
26 dp_max[i][j] = max(dp_max[i][j-1],dp_max[i+(1<<(j-1))][j -1]);
27 dp_min[i][j] = min(dp_min[i][j-1],dp_min[i+(1<<(j-1))][j-1]);
28 }
29 }
30 }
31 }
32 int main()
33 {
34 int n,q,m,k;
35 scanf("%d%d",&n,&q); // 士兵的 总人数 .
36 for(int i = 1; i <= n; i++)
37 {
38 scanf("%d",&dp_max[i][0]); //
39 dp_min[i][0]=dp_max[i][0]; // 最小和最大 都先默认了
40 }
41 RMQ(n); // 一共 有 n 个 数字
42 while(q--)
43 {
44 scanf("%d%d",&m,&k);
45 int s=(int)(log(k-m+1)/log(2));
46 int max_val = max(dp_max[m][s],dp_max[k-(1<<s)+1][s]);
47 int min_val = min(dp_min[m][s],dp_min[k-(1<<s)+1][s]);
48 printf("%d
",max_val - min_val);
49 }
50 return 0;
51 }