답안 #211481

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
211481 2020-03-20T13:37:34 Z Andrei_Cotor Teams (CEOI11_tea) C++11
100 / 100
386 ms 30260 KB
#include<iostream>
#include<algorithm>

using namespace std;

int Prv[1000005],Best[1000005],Dp[1000005];
pair<int,int> A[1000005];
int n,opt;

//nu era corecta solutia precedenta deoarece se putea sa fie mai bine sa extind echipa curenta pt a scadea lungimea precedentei
bool check(int lgmax)
{
    Dp[0]=0;
    Best[0]=0;
    for(int i=1; i<=n; i++)
    {
        Best[i]=Best[i-1];
        if(i<A[i].first)
        {
            Dp[i]=-1000000000;
            continue;
        }

        if(Best[i-A[i].first]>=i-lgmax)
        {
            Dp[i]=1+Dp[Best[i-A[i].first]];
            Prv[i]=Best[i-A[i].first];

            if(Dp[i]>=Dp[Best[i]])
                Best[i]=i;
        }
        else
            Dp[i]=-1000000000;
    }
    return (Dp[n]==opt);
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>A[i].first;
        A[i].second=i;
    }

    sort(A+1,A+n+1); //pax din echipe o sa fie pe pozitii consecutive

    check(n);
    opt=Dp[n];

    int lung=0;
    for(int i=19; i>=0; i--)
    {
        if(!check(lung+(1<<i)))
            lung+=(1<<i);
    }

    check(lung+1);
    cout<<Dp[n]<<"\n";

    int poz=n;
    while(poz!=0)
    {
        cout<<poz-Prv[poz]<<" ";
        for(int i=poz; i>Prv[poz]; i--)
            cout<<A[i].second<<" ";
        cout<<"\n";
        poz=Prv[poz];
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 4 ms 384 KB Output is correct
3 Correct 4 ms 384 KB Output is correct
4 Correct 4 ms 384 KB Output is correct
5 Correct 5 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 384 KB Output is correct
2 Correct 4 ms 384 KB Output is correct
3 Correct 5 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 384 KB Output is correct
2 Correct 5 ms 384 KB Output is correct
3 Correct 5 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 512 KB Output is correct
2 Correct 6 ms 512 KB Output is correct
3 Correct 6 ms 512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 512 KB Output is correct
2 Correct 6 ms 512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 2424 KB Output is correct
2 Correct 28 ms 2680 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 35 ms 2688 KB Output is correct
2 Correct 27 ms 2552 KB Output is correct
3 Correct 34 ms 2940 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 248 ms 20308 KB Output is correct
2 Correct 240 ms 20600 KB Output is correct
3 Correct 283 ms 20344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 367 ms 26488 KB Output is correct
2 Correct 338 ms 30260 KB Output is correct
3 Correct 327 ms 27256 KB Output is correct
4 Correct 327 ms 23800 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 381 ms 25336 KB Output is correct
2 Correct 320 ms 23288 KB Output is correct
3 Correct 328 ms 27000 KB Output is correct
4 Correct 386 ms 26872 KB Output is correct