제출 #372490

#제출 시각아이디문제언어결과실행 시간메모리
372490Atill83Uzastopni (COCI15_uzastopni)C++14
128 / 160
13 ms9964 KiB
#include <bits/stdc++.h> #define ff first #define ss second #define endl '\n' using namespace std; const long long INF = (long long) 1e18; const int mod = (int) 1e9+7; const int MAXN = (int) 3e5+5; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; typedef pair<ll,ll> pll; ll n; int joke[MAXN]; vector<int> adj[MAXN]; pii dfs(int v){ vector<pair<int, pii>> ls, gr; vector<bool> can(101); for(int j: adj[v]){ pii c = dfs(j); if(joke[j] < joke[v]){ ls.push_back({joke[j], c}); }else if(joke[j] > joke[v]) gr.push_back({joke[j], c}); } sort(ls.begin(), ls.end(), greater<pair<int, pii>>()); sort(gr.begin(), gr.end()); can[joke[v]] = 1; for(auto &u: ls){ u.ss.ss = min(u.ss.ss, joke[v] - 1); bool cn = 0; for(int j = u.ff + 1; j <= u.ss.ss + 1; j++){ if(can[j]){ cn = 1; break; } } if(cn){ for(int j = u.ss.ff; j <= u.ff; j++) can[j] = 1; } } for(auto &u: gr){ u.ss.ff = max(u.ss.ff, joke[v] + 1); bool cn = 0; for(int j = u.ss.ff - 1; j < u.ff; j++){ if(can[j]){ cn = 1; break; } } if(cn){ for(int j = u.ff; j <= u.ss.ss; j++){ can[j] = 1; } } } int mn = 0, mx = 100; while(!can[mn]) mn++; while(!can[mx]) mx--; return make_pair(mn, mx); } int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr);cout.tie(nullptr); #ifdef Local freopen("C:/Users/Admin/Desktop/Yazilim/C/IO/int.txt","r",stdin); freopen("C:/Users/Admin/Desktop/Yazilim/C/IO/out.txt","w",stdout); #endif cin>>n; for(int i = 1; i <= n; i++) cin>>joke[i]; for(int i = 0; i < n - 1; i++){ int a, b; cin>>a>>b; adj[a].push_back(b); } pii ans = dfs(1); cout<<(joke[1] - ans.ff + 1) * (ans.ss - joke[1] + 1); #ifdef Local cout<<endl<<fixed<<setprecision(2)<<1000.0 * clock() / CLOCKS_PER_SEC<< " milliseconds "; #endif }
#Verdict Execution timeMemoryGrader output
Fetching results...