码迷,mamicode.com
首页 > 其他好文 > 详细

vijos 1907 飞扬的小鸟

时间:2016-11-14 00:32:40      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:for   define   min   color   ret   efi   int   als   can   

我心里毫无波动甚至还有点想笑。

WTF

WTF

WTF

WTF

WTF

WTF

WTF

GTMD调了一天什么鬼啊。

原来更新的范围有讲究啊。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 1000000007
using namespace std;
int n,m,k,x[10050],y[10050],dp1[10050][1050],dp2[10050][1050],ret=0,ans1=0,mx[10050],ans2=inf;
struct pnt
{
    int p,l,h;
}p[10050];
bool vis[10050][1050];
bool cmp(pnt x,pnt y)
{
    return x.p<y.p;
}
bool fail_all(int x)
{
    for (int j=1;j<=m;j++)
        if (dp2[x][j]!=inf) return false;
    return true;    
}
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for (int i=1;i<=n;i++) scanf("%d%d",&x[i-1],&y[i-1]);
    for (int i=1;i<=k;i++)
        scanf("%d%d%d",&p[i].p,&p[i].l,&p[i].h);
    sort(p+1,p+k+1,cmp);
    for (int i=1;i<=m;i++) vis[0][i]=true;
    for (int i=1;i<=n;i++)
    {
        while ((p[ret+1].p<=i) && (ret<=k-1)) ret++;
        int l,r;
        if (p[ret].p==i) {l=p[ret].l+1;r=p[ret].h-1;}
        else l=0,r=m;
        int limit=1;if (p[ret].p==i-1) limit=p[ret].l+1;
        for (int j=1;j<=m;j++) dp2[i][j]=inf;
        for (int j=1;j<=m-1;j++)
        {
            if (((vis[i][j-x[i-1]]) || (vis[i-1][j-x[i-1]])) && (j>x[i-1]))
            {
                dp1[i][j]=max(dp1[i-1][j-x[i-1]],dp1[i][j-x[i-1]]);
                dp2[i][j]=min(dp2[i][j],dp2[i][j-x[i-1]]+1);
                dp2[i][j]=min(dp2[i][j],dp2[i-1][j-x[i-1]]+1);
                vis[i][j]=true;
            }
        }
        for (int j=1;j<=m-1;j++)
        {
            if ((j+y[i-1]<=m) && (vis[i-1][j+y[i-1]]))
            {
                dp1[i][j]=max(dp1[i][j],dp1[i-1][j+y[i-1]]);
                dp2[i][j]=min(dp2[i][j],dp2[i-1][j+y[i-1]]);
                vis[i][j]=true;
            }
        }
        for (int j=1;j<=m;j++)
        {
            if (vis[i-1][j])
            {
                int ret;
                dp1[i][m]=max(dp1[i][m],dp1[i-1][j]);
                if ((m-j)%x[i-1]) ret=(m-j)/x[i-1]+1;
                else if (m==j) ret=1;
                else ret=(m-j)/x[i-1];
                dp2[i][m]=min(dp2[i][m],dp2[i-1][j]+ret);
                vis[i][m]=true;
            } 
        }
        for (int j=0;j<=l-1;j++) {vis[i][j]=false;dp2[i][j]=inf;}
        for (int j=r+1;j<=m;j++) {vis[i][j]=false;dp2[i][j]=inf;}
        for (int j=1;j<=m;j++)
            if (vis[i][j])
                {
                    dp1[i][j]+=(p[ret].p==i);
                    ans1=max(ans1,dp1[i][j]);
                }
        if (vis[i][m]) ans1=max(ans1,dp1[i][m]);
        if (fail_all(i))
        {
            printf("0\n%d\n",ans1);
            return 0;
        }
    }
    for (int i=0;i<=m;i++)
        if (vis[n][i]) ans2=min(ans2,dp2[n][i]);
    printf("1\n%d\n",ans2);
    return 0;
}

 

vijos 1907 飞扬的小鸟

标签:for   define   min   color   ret   efi   int   als   can   

原文地址:http://www.cnblogs.com/ziliuziliu/p/6060072.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!