Submission #993495

#TimeUsernameProblemLanguageResultExecution timeMemory
993495MarwenElarbiUplifting Excursion (BOI22_vault)C++17
20 / 100
5089 ms8280 KiB
#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
//#pragma GCC optmize("O3")
//#pragma GCC optmize("unroll-loops")
#define fi first
#define se second
#define ll long long
#define pb push_back
#define int long long 
const int nax=205;
vector<pair<int,int>> objects;
void add(int x , int i)
{
    while(x)
    {
        int msb = 31 - __builtin_clz(x);
        if(x == (1<<(msb + 1)) - 1)
        {

            for(int j = 0 ; j <= msb ; j++)
            {
                objects.pb({(1<<j) * i, (1<<j)});
            }
            break;
        }
        int cur=0;
        for(int j = 0 ; j < msb ; j++)
        {
            cur+=(1<<j);
            objects.pb({(1<<j) * i , (1<<j)});
        }
        x-=cur;
    }
}
vector<int> dp;
const int INF = 1e18;
signed main(){
    int m , L;
    cin>>m>>L;
    int ans = 0;
    int MX=0;
    int MN=0;
    for(int i = -m ; i <= m ; i++)
    {
        int x;
        cin>>x;
        if(i>0) MX+=x*i;
        else MN-=x*i;
        if(i == 0){
            ans=x;
        }else add(x , i);
    }
    MX=max(abs(MN),abs(MX));
    MX++;
    dp.resize(2*MX);
    for(int i = -MX + 1 ; i <= MX - 1; i++)
    {
        dp[i + MX] = -INF;
    }
    dp[MX] = ans;
    sort(objects.begin(),objects.end());
    for(auto c : objects){
        if(c.fi > 0){
            for(int j = MX - 1 ; j >= -MX + 1 ; j--)
            {
                if(j - c.fi >= -MX + 1)
                    dp[j + MX] = max(dp[j+MX] , dp[j - c.fi + MX] + c.se);
            }
        }else 
        {
            for(int j = -MX + 1 ; j <= MX - 1 ; j++)
            {
                if(j - c.fi <= MX - 1)
                {
                    dp[j+ MX] = max(dp[j+ MX] , dp[j - c.fi+ MX] + c.se);
                }
            }
        }
    }
    if(L>=MX||L<=-MX) cout <<"impossible"<<endl;
    else if(dp[L+MX]<=0) cout <<"impossible"<<endl;
    else cout << dp[L+MX]<<endl;
}
#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...
#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...