标签:单调队列
1 2 3 2 3 4 3 4 5 4 5 6 5 6 7
2 3 4 5 6
这题可以用单调队列做,存储每次的时间和大小。
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<map> #include<string> using namespace std; #define maxn 10000005 #define ll __int64 ll q[maxn][2]; int main() { ll n,m,A,B,ans,front,rear,time,sum,timenow; int i,j; while(scanf("%I64d%I64d%I64d",&n,&A,&B)!=EOF) { front=1;rear=0;ans=1;sum=1; for(i=1;i<=n;i++){ ans=(ans*A)%B; if(i-A<1)time=1; else time=i-A; while(front<=rear && ans<=q[rear][0]){ rear--; } rear++; q[rear][0]=ans;q[rear][1]=i; while(front<=rear && q[front][1]<time)front++; sum=(sum*q[front][0])%B; } printf("%I64d\n",sum%B); } return 0; }
hdu3706 Second My Problem First
标签:单调队列
原文地址:http://blog.csdn.net/kirito_acmer/article/details/45821269