답안 #589778

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
589778 2022-07-05T09:05:24 Z andrei_boaca 조교 (CEOI16_popeala) C++14
0 / 100
597 ms 57564 KB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
struct date
{
    ll val,cntmin,cntmax;
} dp[20005];
ll cost[4005][4005];
int n,t,s;
int val[20005];
bool have[55][20005];
bool bad[55];
int mycost[55];
void makedp(ll c)
{
    dp[0].val=0;
    dp[0].cntmin=0;
    dp[0].cntmax=0;
    for(int i=1;i<=t;i++)
    {
        dp[i].val=1e16;
        dp[i].cntmin=2e9;
        dp[i].cntmax=0;
        for(int j=i-1;j>=0;j--)
        {
            ll val=dp[j].val+cost[j+1][i]-c;
            ll nrmin=dp[j].cntmin+1;
            ll nrmax=dp[j].cntmax+1;
            if(val<dp[i].val)
            {
                dp[i].val=val;
                dp[i].cntmin=nrmin;
                dp[i].cntmax=nrmax;
            }
            else if(val==dp[i].val)
                {
                    dp[i].cntmin=min(dp[i].cntmin,nrmin);
                    dp[i].cntmax=max(dp[i].cntmax,nrmax);
                }
        }
    }
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>t>>s;
    for(int i=1;i<=t;i++)
        cin>>val[i];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=t;j++)
        {
            char c;
            cin>>c;
            have[i][j]=c-'0';
        }
    for(int i=1;i<=t;i++)
    {
        for(int j=1;j<=n;j++)
        {
            bad[j]=0;
            mycost[j]=0;
        }
        int cur=0;
        for(int j=i;j<=t;j++)
        {
            for(int k=1;k<=n;k++)
                if(!bad[k])
                {
                    if(have[k][j])
                    {
                        cur+=val[j];
                        mycost[k]+=val[j];
                    }
                    else
                    {
                        bad[k]=1;
                        cur-=mycost[k];
                        mycost[k]=0;
                    }
                }
            cost[i][j]=cur;
        }
    }
    for(int a=1;a<=s;a++)
    {
        ll st=1;
        ll dr=2e9;
        bool found=0;
        while(st<=dr)
        {
            ll mij=(st+dr)/2;
            makedp(mij);
            if(a>=dp[t].cntmin&&a<=dp[t].cntmax)
            {
                cout<<dp[t].val+a*mij;
                found=1;
                break;
            }
            if(a>dp[t].cntmax)
                st=mij+1;
            else if(a<dp[t].cntmin)
                dr=mij-1;
        }
        assert(found);
        cout<<'\n';
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Runtime error 4 ms 1108 KB Execution killed with signal 6
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 36 ms 7116 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 597 ms 57564 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Runtime error 4 ms 1108 KB Execution killed with signal 6
3 Halted 0 ms 0 KB -