单调队列(基础题) 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;
}
题意:对于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;
}
相关文章推荐
- YUM介绍
- 【New AKOJ】最左边一位数
- poj2923 状态压缩背包dp
- 分块题目总结+注意事项
- 回车和换行的区别
- 制作比较好的网站
- 使用py-faster-rcnn训练自己的数据
- 理解什么是游标,什么是指针
- Android Studio 开发中碰到的问题总结
- 函数指针和回调函数
- 【NOIP2010】关押罪犯
- 漂亮回答面试官struts2的原理
- 详细记录python的range()函数用法
- 肿瘤检测
- 《CSS权威指南》学习记录——特殊性和层叠
- Ehcache Memcache Redis 初步 (一)
- 分页关键知识点总结
- RN----导入组件,import from 'xxxx'的用法详解
- hdu 2639Bone Collector II(01背包求第k大)
- Android应用签名与防止反编译(一)