// hdu 5875 Function 单调栈 + 暴力
//
// 题目链接:
//
// http://acm.split.hdu.edu.cn/showproblem.php?pid=5875
//
// 题目大意:
//
// 一数组,给定区间[l,r],求a[l] % a[l + 1] % ... % a[r]
//
// 解题思路:
//
// 对于%,只有比本身小到数才会影响最后结果,所以我们维护
// 一个单调递增序列,和next数组,表示比当前数小到下一个数的
// 位置,采用单调栈即可
//
// 感悟:
//
// 有点尴尬,题目意思很明显,确实没想到这样到解题思路。
// 但看到各位大神的解题思路,就觉得十分明显,道理也都通晓。
// 继续努力 ^_^
#include <cstdio>
#include <iostream>
#include <cstring>
#include <stack>
#include <set>
#include <queue>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 8;
int a[MAXN];
int ne[MAXN];
stack<int> st;
int n,m;
void init(){
memset(ne,-1,sizeof(ne));
while(!st.empty())
st.pop();
}
void input(){
scanf("%d",&n);
for (int i = 1;i <= n;i ++){
scanf("%d",a + i);
}
for (int i = 1;i <= n;i ++){
while(!st.empty() && a[i] < a[st.top()]){
ne[st.top()] = i;
st.pop();
}
st.push(i);
}
scanf("%d",&m);
int l,r;
for (int i = 1;i <= m;i ++){
scanf("%d%d",&l,&r);
int ans = a[l];
int ind = l;
while(ne[ind] <= r && ne[ind] != -1){
ans %= a[ne[ind]];
ind = ne[ind];
}
printf("%d\n",ans);
}
}
int main(){
int t;
while(scanf("%d",&t)!=EOF){
while(t--){
init();
input();
}
}
return 0;
}
hdu 5875 Function 单调栈 + 暴力
最新推荐文章于 2022-08-31 14:48:20 发布