hdu(HDU5945)单调队列优化DP

来源:互联网 发布:anywhere远程桌面软件 编辑:程序博客网 时间:2024/06/05 12:45
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 1000000+10;int dp[maxn];int q[maxn];int main(){    int cases,x,k,t;    scanf("%d",&cases);    while(cases--)    {        memset(dp,0x3f3f3f3f,sizeof(dp));        scanf("%d%d%d",&x,&k,&t);        if(k==0)        {            if((x-1)%t) printf("%d\n",(x-1)/t+1);            else printf("%d\n",(x-1)/t);            continue;        }        if(t==0)        {            int ans = 0;            while(x>1) x/=k,ans++;            printf("%d\n",ans); continue;        }        dp[1] = 0; int l = 1,r = 1; q[1] = 1;        for(int i=2;i<=x;i++)        {            while(l<=r&&q[l]+t<i) l++;            if(l<=r)  dp[i] = min(dp[i],1+dp[q[l]]);            if(i%k==0)  dp[i] = min(dp[i],1+dp[i/k]);            while(l<=r&&dp[q[r]]>=dp[i]) r--;            q[++r] = i;        }        printf("%d\n",dp[x]);    }    return 0;}

原创粉丝点击