Submission #1185263

#TimeUsernameProblemLanguageResultExecution timeMemory
1185263vitoNestabilnost (COI23_nestabilnost)C++17
7 / 100
165 ms440 KiB
#include <bits/stdc++.h> using namespace std; using ll=long long; #define F first #define S second #define sz(x) int(x.size()) const ll INF=1e18+5; const int MAX=25; vector<int> gr[MAX]; int bio[MAX]; int par[MAX]; int up[MAX][MAX]; int n; vector<int> t; void dfs(int v, int p) { for(auto &u : gr[v]) { if(u!=p) { par[u]=v; dfs(u, v); } } } void siri(int v, int p) { for(auto &u : gr[v]) { if(u!=p && up[v][u]==0 && bio[u]==0) { t.push_back(u); bio[u]=1; // cout << v << " -> " << u << '\n'; siri(u, v); } } } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; if(n>20) { cout << "skibidi\n"; return 0; } vector<int> a(n+1); for(int i=1; i<=n; i++) { cin >> a[i]; } vector<ll> f(n+1); for(int k=1; k<=n; k++) { cin >> f[k]; } vector<ll> suff(n+1); suff[n]=f[n]; for(int i=n-1; i>=1; i--) { suff[i]=min(suff[i+1], f[i]); } vector<pair<int, int>> ed(n-1); for(int i=0; i<n-1; i++) { cin >> ed[i].F >> ed[i].S; gr[ed[i].F].push_back(ed[i].S); gr[ed[i].S].push_back(ed[i].F); } dfs(1, 1); ll out=INF; for(int mask=0; mask<(1<<(n-1)); mask++) { for(int i=0; i<n-1; i++) { if(mask&(1<<i)) { up[ed[i].F][ed[i].S]=1; up[ed[i].S][ed[i].F]=1; } } for(int i=1; i<=n; i++) { bio[i]=0; } int ok=1; ll cost=0; for(int i=1; ok && i<=n; i++) { if(bio[i]==0) { bio[i]=1; t={i}; siri(i, i); // cout << "t: "; // for(auto &j : t) { // cout << j << ' ' << par[j] << '\n'; // } // cout << '\n'; int mx=0; int mora=n+5; for(auto &j : t) { mx=max(mx, a[j]); if(j==1) { continue; } if(up[par[j]][j]==0) { int pro=a[par[j]]; int sad=a[j]; if(sad<=pro && sad!=0) { // cout << "v = " << j << '\n'; ok=0; break; } if(pro+1==sad) { if(sad>=mora) { ok=0; // cout << "v = " << j << '\n'; break; } } else if(sad==0) { if(mora==n+5) { mora=pro+1; if(mora<=mx) { ok=0; // cout << "v = " << j << '\n'; break; } } else { if(mora!=pro+1) { ok=0; // cout << "v = " << j << '\n'; break; } } } else { ok=0; // cout << "v = " << j << '\n'; break; } } } if(mora==n+5) { cost+=suff[mx+1]; } else { cost+=f[mora]; } // cout << "mora = " << mora << '\n'; // cout << "ok = " << ok << '\n'; // cout << "cost = " << cost << '\n'; // break; } } if(ok) { out=min(out, cost); // if(cost==2) { // auto mm=mask; // while(mm) { // cout << mm%2; // mm/=2; // } // cout << '\n'; // } } for(int i=0; i<n-1; i++) { if(mask&(1<<i)) { up[ed[i].F][ed[i].S]=0; up[ed[i].S][ed[i].F]=0; } } } cout << out << '\n'; return 0; }
#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...