NC50449. 天才的记忆
描述
输入描述
第一行一个整数N表示数字的个数,接下来一行为N个数。第三行读入一个M,表示你看完那串数后需要被提问的次数,接下来M行,每行都有两个整数A,B。
输出描述
输出共M行,每行输出一个数,表示对一个问题的回答。
示例1
输入:
6 34 1 8 123 3 2 4 1 2 1 5 3 4 2 3
输出:
34 123 123 8
C++14(g++5.4) 解法, 执行用时: 104ms, 内存消耗: 20808K, 提交时间: 2020-01-29 15:43:52
#include <bits/stdc++.h> using namespace std; int a[200005],st[200005][25],n; int main() { int m; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",a+i),st[i][0] = a[i]; for(int j=1;(1<<j)<=n;j++) for(int i=1;(i+(1<<j-1))<=n;i++) st[i][j] = max(st[i][j-1],st[i+(1<<j-1)][j-1]); scanf("%d",&m); while(m--) { int l,r; scanf("%d%d",&l,&r); if(l<=1)l=1; if(r>=n)r=n; int k = log(r-l+1)/log(2); int ans = max(st[l][k],st[r-(1<<k)+1][k]); printf("%d\n",ans); } }
C++(clang++ 11.0.1) 解法, 执行用时: 836ms, 内存消耗: 1348K, 提交时间: 2023-02-19 08:55:33
#include<bits/stdc++.h> using namespace std; const int N=200010; int a[N]; int n,m; int main() { cin>>n; for(int i=0;i<n;i++) cin>>a[i]; cin>>m; while(m--){ int l,r; cin>>l>>r; cout<<*max_element(a+l-1,a+r)<<endl; } return 0; }