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

来源:互联网 发布:免费舆情监控软件 编辑:程序博客网 时间:2024/05/17 20:33

:点击打开链接

题意:对于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;}


0 0
原创粉丝点击