This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, m;
vector <int> d;
vector <vector <int> > dp0, dp1, g;
vector <bool> used;
vector <int> sz;
vector <int> prev0, prev1;
int min(int a, int b)
{
if(a < b)
{
return a;
}
return b;
}
void dfs(int v, int p = -1)
{
if(v != n)
{
for(int i = 0; i < g[v].size(); i++)
{
int to = g[v][i];
if(to != p)
{
dfs(to, v);
}
}
}
used[v] = true;
int allsz = 0;
dp0[v][0] = 0;
sz[v] = 1;
prev0[0] = 0;
prev1[0] = 1e18;
for(int i = 0; i < g[v].size(); i++)
{
int to = g[v][i];
if(to != p)
{
sz[v] += sz[to];
for(int k = 0; k <= allsz + sz[to]; k++)
{
dp0[v][k] = 1e18;
dp1[v][k] = 1e18;
}
for(int k = 0; k <= allsz; k++)
{
for(int k1 = 0; k1 <= sz[to]; k1++)
{
dp0[v][k + k1] = min(dp0[v][k + k1], prev0[k] + min(dp0[to][k1], dp1[to][k1]));
dp1[v][k + k1] = min(dp1[v][k + k1], prev1[k] + min(dp0[to][k1], dp1[to][k1]));
dp1[v][k + k1] = min(dp1[v][k + k1], prev0[k] + dp1[to][k1]);
if(k1 > 0)
{
dp1[v][k + k1] = min(dp1[v][k + k1], min(prev1[k], prev0[k]) + dp0[to][k1 - 1] + d[to]);
}
}
}
allsz += sz[to];
for(int k = 0; k <= allsz; k++)
{
prev1[k] = dp1[v][k];
prev0[k] = dp0[v][k];
}
}
}
for(int k = allsz; k >= 0; k--)
{
dp1[v][k + 1] = min(1LL * 1e18, dp1[v][k] + d[v]);
}
dp1[v][0] = 1e18;
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
d.resize(n + 1);
sz.resize(n + 1);
g.resize(n + 1);
prev0.resize(n + 2);
prev1.resize(n + 2);
used.resize(n + 1);
dp0.resize(n + 1, vector <int> (n + 2, 1e18));
dp1.resize(n + 1, vector <int> (n + 2, 1e18));
for(int i = 0; i < n; i++)
{
cin >> d[i];
}
for(int i = 0; i < m; i++)
{
int a, b;
cin >> a >> b;
a--;
b--;
g[a].push_back(b);
g[b].push_back(a);
}
for(int i = 0; i < n; i++)
{
if(!used[i])
{
dfs(i);
g[n].push_back(i);
}
}
dfs(n);
for(int i = n - 1; i >= 0; i--)
{
dp0[n][i] = min(dp0[n][i], dp0[n][i + 1]);
}
int q;
cin >> q;
while(q--)
{
int s;
cin >> s;
int l = 0, r= n + 1;
while(r - l > 1)
{
int midd = (r + l) / 2;
if(dp0[n][midd] <= s)
{
l = midd;
}
else
{
r = midd;
}
}
cout << l << "\n";
}
return 0;
}
Compilation message (stderr)
dzumbus.cpp: In function 'void dfs(long long int, long long int)':
dzumbus.cpp:22:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0; i < g[v].size(); i++)
~~^~~~~~~~~~~~~
dzumbus.cpp:37:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0; i < g[v].size(); i++)
~~^~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |