제출 #74422

#제출 시각아이디문제언어결과실행 시간메모리
74422gs18115요리 강좌 (KOI17_cook)C++14
100 / 100
581 ms296536 KiB
#include<iostream>
#include<deque>
using namespace std;
typedef long long LL;
const LL MAXN=3010;
const LL INF=1e18;
const LL inf=1e15;
struct STRUCT
{
    LL aa,cost;
}mini[MAXN][3];
LL NA[MAXN];
inline bool chk(const LL&day,const LL&X,const LL&i)
{
    return mini[day][i].aa!=X&&mini[day][i].aa!=NA[X];
}
inline LL mincost(const LL&day,const LL&X)
{
    if(chk(day,X,0))
        return mini[day][0].cost;
    else if(chk(day,X,1))
        return mini[day][1].cost;
    return mini[day][2].cost;
}
inline void minch(const LL&day,const LL&aa,const LL&cost)
{
    if(cost<mini[day][0].cost)
    {
        mini[day][2]=mini[day][1];
        mini[day][1]=mini[day][0];
        mini[day][0]={aa,cost};
    }
    else if(cost<mini[day][1].cost)
    {
        mini[day][2]=mini[day][1];
        mini[day][1]={aa,cost};
    }
    else if(cost<mini[day][2].cost)
        mini[day][2]={aa,cost};
    return;
}
deque<STRUCT>deq[MAXN];
LL N,M,s,e,T;
LL i,j;
LL MIN,t;
LL cost;
LL S[MAXN][MAXN];
LL dp[MAXN][MAXN];
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin>>N>>M>>s>>e>>T;
    for(i=1;i<=N;i++)
    {
        for(j=1;j<=M;j++)
        {
            cin>>cost;
            S[i][j]=S[i][j-1]+cost;
        }
    }
    for(i=1;i<=N;i++)
        cin>>NA[i];
    mini[0][0]=mini[0][1]=mini[0][2]={0,0};
    for(i=1;i<=M;i++)
        mini[i][0]=mini[i][1]=mini[i][2]={0,INF};
    for(i=1;i<=M;i++)
    {
        for(j=1;j<=N;j++)
        {
            while(!deq[j].empty())
            {
                if(deq[j].front().aa<i-e)
                    deq[j].pop_front();
                else
                    break;
            }
            if(i>=s)
            {
                t=mincost(i-s,j)-S[j][i-s];
                while(!deq[j].empty())
                {
                    if(deq[j].back().cost>=t)
                        deq[j].pop_back();
                    else
                        break;
                }
                if(t<inf)
                    deq[j].push_back({i-s,t});
            }
            if(deq[j].empty())
                dp[i][j]=INF;
            else
            {
                dp[i][j]=deq[j].front().cost+S[j][i]+T;
                minch(i,j,dp[i][j]);
            }
        }
    }
    MIN=INF;
    for(i=M-e;i<M;i++)
    {
        for(j=1;j<=N;j++)
        {
            t=mincost(i,j)+T+S[j][M]-S[j][i];
            if(MIN>t)
                MIN=t;
        }
    }
    cout<<MIN-T<<endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...