QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#573366 | #3940. ISP Merger | LaVuna47# | WA | 1ms | 3840kb | C++17 | 4.0kb | 2024-09-18 18:23:32 | 2024-09-18 18:23:32 |
Judging History
answer
/** gnu specific **/
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
/** contains everything I need in std **/
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define sz(S) ((int)S.size())
#define FOR(i, n) for(int i = 0; i < n; ++i)
#define RFOR(i, n) for(int i = n-1; i >= 0; --i)
#define output_vec(vec) { FOR(i_, sz(vec)) cout << vec[i_] << ' '; cout << '\n'; }
#define x first
#define y second
#define pb push_back
using namespace std;
typedef long long ll;
typedef vector<ll> vll;
typedef unsigned long long ull;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef vector<bool> vb;
typedef short si;
typedef unsigned long long ull;
typedef long double LD;
typedef pair<ull, ull> pull;
using namespace __gnu_pbds;
typedef tree<ll, null_type, less<>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
using namespace std;
#ifdef ONPC
mt19937 rnd(228);
#else
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
#endif
vector<vector<int>> g;
vector<bool> vis;
void dfs(int v, vector<int>& comp)
{
vis[v] = 1;
comp.pb(v);
for (int to: g[v])
if (!vis[to])
dfs(to, comp);
}
int solve()
{
int n, m, k;
if (!(cin >> n >> m >> k))
return 1;
g.clear();
g.resize(n);
vis.clear();
vis.resize(n, false);
vector<int> cap(n);
FOR (i, n)
cin >> cap[i];
FOR (i, m)
{
int v, w;
cin >> v >> w;
g[v].pb(w);
g[w].pb(v);
}
if (n == 1)
{
cout << "yes\n";
return 0;
}
vector<vector<int>> comps;
vector<int> comp;
FOR (i, n)
{
if (!vis[i])
dfs(i, comp);
if (!comp.empty())
comps.pb(comp);
comp.clear();
}
int nn = sz(comps);
//cout << "nn = " << nn << '\n';
if (nn == 1)
{
cout << "yes\n";
return 0;
}
// 1 < nn -k
if (nn - k > 1)
{
cout << "no\n";
return 0;
}
vector<int> caps(nn), as(nn);
FOR (i, nn)
{
int curr = 0;
auto el = comps[i];
for (int idx: el)
curr += -sz(g[idx]) + cap[idx];
caps[i] = curr;
curr = 0;
for (int idx: el)
curr += sz(g[idx]);
curr /= 2;
as[i] = curr - (nn - 1);
}
vector<int> newcaps, newas;
FOR (i, nn)
{
if (caps[i])
{
newcaps.pb(caps[i]);
newas.pb(as[i]);
}
else if (as[i])
{
newcaps.pb(caps[i] + 2);
newas.pb(as[i] - 1);
}
else
{
newcaps.pb(1);
newcaps.pb(1);
newas.pb(0);
newas.pb(0);
}
}
caps.swap(newcaps);
as.swap(newas);
nn = sz(caps);
int sma = accumulate(all(as), 0);
int smcaps = accumulate(all(caps), 0);
k -= nn - 1;
if (k < 0)
{
cout << "no\n";
return 0;
}
while (sma > 0 && smcaps < 2 * (nn - 1))
{
sma--;
smcaps += 2;
--k;
if (k < 0)
{
cout << "no\n";
return 0;
}
}
if (smcaps >= 2 * (nn - 1))
cout << "yes\n";
else
cout << "no\n";
return 0;
}
int32_t main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int TET = 1e9;
//cin >> TET;
for (int i = 1; i <= TET; i++)
{
if (solve())
{
break;
}
#ifdef ONPC
cout << "__________________________" << endl;
#endif
}
#ifdef ONPC
cerr << endl << "finished in " << clock() * 1.0 / CLOCKS_PER_SEC << " sec" << endl;
#endif
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3840kb
input:
4 5 2 3 3 3 3 0 1 0 3 1 3 1 2 2 3
output:
yes
result:
ok answer is YES
Test #2:
score: 0
Accepted
time: 0ms
memory: 3584kb
input:
5 4 4 1 1 2 2 2 0 1 2 3 3 4 4 2
output:
yes
result:
ok answer is YES
Test #3:
score: 0
Accepted
time: 0ms
memory: 3676kb
input:
3 0 3 1 1 1
output:
no
result:
ok answer is NO
Test #4:
score: -100
Wrong Answer
time: 1ms
memory: 3720kb
input:
500 500 165 2 2 2 1 2 3 3 2 2 3 3 3 3 2 3 4 2 1 1 2 5 1 1 1 3 1 1 1 1 1 1 1 2 1 1 1 4 2 2 3 1 3 2 2 1 2 4 1 1 1 1 5 2 2 1 4 1 2 5 1 3 2 1 2 5 1 2 1 2 3 2 1 2 1 1 2 1 1 1 1 2 4 2 1 3 3 4 3 3 1 3 2 1 1 1 2 2 2 1 1 1 2 5 1 3 5 3 2 2 2 2 2 4 1 2 3 2 2 2 2 2 1 2 2 3 2 2 2 4 4 5 1 4 1 1 1 4 4 1 2 1 2 2 2 ...
output:
no
result:
wrong answer expected YES, found NO