您的位置:首页 > 其它

单调队列(基础题) HDU3706 Second My Problem First

2016-05-28 11:03 337 查看
:点击打开链接

题意:对于S i = A i,在(1 <= i <= n)的范围内,分别求出对应i的最小Si,然后Ti的值即为n个Si的乘积;

我是看了题解才明白题意的orzorz

然后注意一点,因为a的范围就是int 的最大值,所以x要设成long long 类型不然相乘就会超int的

和前面一题不一样,这题只求最前面的那个值,和最大最小区间没关系,所以是一道基础题啦啦啦
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n,a,b;
while(~scanf("%I64d%I64d%I64d",&n,&a,&b)){
long long x=1;
long long ti=1;
deque<pair<int,int> >minq;
for(long long i=1;i<=n;i++){
x=x*a%b;
while(!minq.empty()&&minq.back().second>x){
minq.pop_back();
}
minq.push_back(make_pair(i,x));
while(!minq.empty()&&minq.front().first<i-a){
minq.pop_front();
}
ti=ti*(minq.front().second)%b;
}
printf("%I64d\n",ti);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: