zoukankan      html  css  js  c++  java
  • poj 2373 单调队列优化背包

    思路:我们用单调队列保存2*b<=i-j<=2*a中的最大值。那么队列头就是最大值,如果队头的标号小于i-2*b的话,就出队,后面的肯定用不到它了。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define inf 10000010
    #define Maxn 1010
    #define Min(a,b) (a)>(b)?(b):(a)
    using namespace std;
    int dp[1000010],que[1000010],head,rear,interv[1200010];
    struct Inter{
        int l,r;
        int operator<(const Inter &temp) const
        {
            return l<temp.l;
        }
    }p[Maxn];
    int main()
    {
        int n,l,i,j,t,a,b;
        while(scanf("%d%d",&n,&l)!=EOF)
        {
            scanf("%d%d",&a,&b);
            memset(interv,1,sizeof(interv));
            for(i=1;i<=n;i++)
            {
                scanf("%d%d",&p[i].l,&p[i].r);
                memset(interv+p[i].l+1,0,(p[i].r-p[i].l-1)*sizeof(interv[0]));
            }
            dp[0]=0;
            head=1,rear=0;
            for(i=2;i<=l;i++)
            {
                dp[i]=inf;
                j=i-2*a;
                if(j<0) continue;
                while(head<=rear&&dp[j]<=dp[que[rear]])
                    rear--;
                if(interv[j])
                    que[++rear]=j;
                if(que[head]<i-2*b&&head<=rear)
                    head++;
                if(!interv[i]||(i&1)) continue;
                if(head<=rear)
                dp[i]=dp[que[head]]+1;
            }
            if(dp[l]>=inf) printf("-1
    ");
            else printf("%d
    ",dp[l]);
        }
        return 0;
    }
  • 相关阅读:
    nginx限速 原理
    规则引擎 图形界面
    阿里巴巴 规则引擎
    martinfowler Data Guide big data bad things
    Nginx Request URI too large
    linux2.6.30.4内核移植(1)
    根文件系统
    Linux内核配置:定制配置选项
    Linux内核配置:Kconfig
    Linux内核配置:Makefile目标
  • 原文地址:https://www.cnblogs.com/wangfang20/p/3237743.html
Copyright © 2011-2022 走看看