Submission #1357569

#TimeUsernameProblemLanguageResultExecution timeMemory
1357569thesentroDžumbus (COCI19_dzumbus)C++20
110 / 110
163 ms57432 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
#define ll long long
ll mod = 998244353;
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

ll binpow(ll a, ll b)
{
    ll res = 1;
    while (b>0)
    {
        if (b&1)
            res = (res*a)%mod;
        a = (a*a)%mod;
        b>>=1;
    }
    return res;
}
ll gcd(ll x, ll y)
{
    if (y==0)
        return x;
    return gcd(y, x%y);
}
ll maxi = 1010;
vector<vector<vector<ll>>>dp(maxi, vector<vector<ll>>(maxi, vector<ll>(3, 1e15)));
vector<vector<ll>>g(maxi);
vector<ll>v(maxi);
vector<ll>vis(maxi, 0), sz(maxi, 0);
void dfs(ll x)
{
    vis[x] = 1;
    for (auto i:g[x])
    {
        if (vis[i]==0 and i!=0)
            dfs(i);
    }
}
void dfs1(ll x, ll p)
{
    dp[x][0][1] = v[x];
    dp[x][0][0] = 0;
    sz[x]++;
    for (auto i:g[x])
    {
        if (i!=p)
        {
            dfs1(i, x);
            vector<vector<ll>>temp = dp[x];
            for (int j1=sz[x] ; j1>=0 ; j1--)
            {
                for (int j2=sz[i] ; j2>=0 ; j2--)
                {
                    temp[j1+j2][0] = min(temp[j1+j2][0], dp[x][j1][0] + min({dp[i][j2][0], dp[i][j2][2]}));
                    temp[j1+j2][1] = min(temp[j1+j2][1], dp[x][j1][1] + dp[i][j2][0]);
                    temp[j1+j2+2][2] = min(temp[j1+j2+2][2], dp[x][j1][1] + dp[i][j2][1]);
                    temp[j1+j2+1][2] = min(temp[j1+j2+1][2], dp[x][j1][1] + dp[i][j2][2]);
                    temp[j1+j2+1][2] = min(temp[j1+j2+1][2], dp[x][j1][2] + dp[i][j2][1]);
                    temp[j1+j2][2] = min(temp[j1+j2][2], dp[x][j1][2] + dp[i][j2][0]);
                    temp[j1+j2][2] = min(temp[j1+j2][2], dp[x][j1][2] + dp[i][j2][2]);
                }
            }
            dp[x] = temp;
            sz[x] += sz[i];
        }
    }
}
void solve()
{
    ll n,m;
    cin>>n>>m;
    for (int i=1 ; i<=n ; i++) cin>>v[i];
    for (int i=1 ; i<=m ; i++)
    {
        ll x,y;
        cin>>x>>y;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    for (int i=1 ; i<=n ;i++)
    {
        if (vis[i]==0)
        {
            dfs(i);
            g[0].push_back(i);
        }
    }
    v[0] = 1e15;
    dfs1(0, -1);
    vector<ll>cst(maxi);
    for (int i=0 ; i<maxi ; i++)
        cst[i] = dp[0][i][0];
    for (int i=maxi-2 ; i>=0 ; i--) cst[i] = min(cst[i], cst[i+1]);

    ll q;
    cin>>q;
    while (q--)
    {
        ll x;
        cin>>x;
        ll it = upper_bound(cst.begin(), cst.end(), x) - cst.begin();
        it--;
        cout<<it<<endl;
    }

}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    ll tt = 1;
    // cin>>tt;
    while (tt--)
    {
        solve();
    }
    return 0;
}
 
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...