Submission #787733

#TimeUsernameProblemLanguageResultExecution timeMemory
787733ByeWorldThe Xana coup (BOI21_xanadu)C++14
10 / 100
89 ms33908 KiB
#include <bits/stdc++.h> //#pragma GCC optimize("O3") #define int long long #define fi first #define se second #define pb push_back #define lb lower_bound using namespace std; const int MAXN = 2e5+10; const int SQRT = 700; const int MOD = 998244353; const int LOG = 21; const int INF = 1e13+10; typedef pair<int,int> pii; typedef pair<pii,int> ipii; int n; vector <int> adj[MAXN]; int dp[MAXN][2][2]; int b[MAXN]; void dfs(int nw, int par){ if(par!=-1 && adj[nw].size() == 1){ if(b[nw]){ dp[nw][0][1] = 0; dp[nw][1][0] = 1; dp[nw][1][1] = INF; dp[nw][0][0] = INF; } else { dp[nw][0][0] = 0; dp[nw][1][1] = 1; dp[nw][1][0] = INF; dp[nw][0][1] = INF; } return; } vector <int> vec[2][2]; for(auto nx : adj[nw]){ if(nx == par) continue; dfs(nx, nw); //build dp bawah } //klik 1, nyala 1 for(auto nx : adj[nw]){ if(nx == par) continue; dp[nw][1][1] += dp[nx][0][1]; vec[1][1].pb(dp[nx][1][1]-dp[nx][0][1]); //switch gk klik nyala -> klik nyala } sort(vec[1][1].begin(), vec[1][1].end()); int sum = 0, mx = 0, cnt = 0; for(int i=0; i<vec[1][1].size(); i++){ int in = vec[1][1][i]; if(cnt==0){ sum += in; mx = in; cnt++; continue; } if(in > 0) break; sum += in; mx = in; cnt++; } if(b[nw] == 1){ //odd->odd klik nyala, optimal if(cnt%2==1) dp[nw][1][1] += sum; else dp[nw][1][1] += (sum-mx); } else { if(cnt%2==1) dp[nw][1][1] += (sum-mx); else dp[nw][1][1] += sum; } dp[nw][1][1]++; //klik 1, nyala 0 for(auto nx : adj[nw]){ if(nx == par) continue; dp[nw][1][0] += dp[nx][0][1]; vec[1][0].pb(dp[nx][1][1]-dp[nx][0][1]); //switch gk klik nyala -> klik nyala } sort(vec[1][0].begin(), vec[1][0].end()); sum = 0, mx = 0, cnt = 0; for(int i=0; i<vec[1][0].size(); i++){ int in = vec[1][0][i]; if(cnt==0){ sum += in; mx = in; cnt++; continue; } if(in > 0) break; sum += in; mx = in; cnt++; } if(b[nw] == 1){ //odd->even klik nyala if(cnt%2==1) dp[nw][1][0] += (sum-mx); else dp[nw][1][0] += sum; } else { if(cnt%2==1) dp[nw][1][0] += sum; else dp[nw][1][0] += (sum-mx); } dp[nw][1][0]++; //klik 0, nyala 0 for(auto nx : adj[nw]){ if(nx == par) continue; dp[nw][0][0] += dp[nx][0][0]; vec[0][0].pb(dp[nx][1][0]-dp[nx][0][0]); //switch gk klik mati -> klik mati } sort(vec[0][0].begin(), vec[0][0].end()); sum = 0, mx = 0, cnt = 0; for(int i=0; i<vec[0][0].size(); i++){ int in = vec[0][0][i]; if(cnt==0){ sum += in; mx = in; cnt++; continue; } if(in > 0) break; sum += in; mx = in; cnt++; } if(b[nw] == 1){ //odd->odd klik nyala if(cnt%2==1) dp[nw][0][0] += sum; else dp[nw][0][0] += (sum-mx); } else { if(cnt%2==1) dp[nw][0][0] += (sum-mx); else dp[nw][0][0] += sum; } //klik 0, nyala 1 for(auto nx : adj[nw]){ if(nx == par) continue; dp[nw][0][1] += dp[nx][0][0]; vec[0][1].pb(dp[nx][1][0]-dp[nx][0][0]); //switch gk klik mati -> klik mati } sort(vec[0][1].begin(), vec[0][1].end()); sum = 0, mx = 0, cnt = 0; for(int i=0; i<vec[0][1].size(); i++){ int in = vec[0][1][i]; if(cnt==0){ sum += in; mx = in; cnt++; continue; } if(in > 0) break; sum += in; mx = in; cnt++; } if(b[nw] == 1){ //odd->even klik nyala if(cnt%2==1) dp[nw][0][1] += (sum-mx); else dp[nw][0][1] += sum; } else { if(cnt%2==1) dp[nw][0][1] += sum; else dp[nw][0][1] += (sum-mx); } } signed main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin >> n; for(int i=1; i<=n-1; i++){ int x, y; cin >> x >> y; adj[x].pb(y); adj[y].pb(x); } for(int i=1; i<=n; i++) cin >> b[i]; dfs(1, -1); int ans = min(dp[1][1][0], dp[1][0][0]); if(ans>=n) cout << "impossible\n"; else cout << ans << '\n'; // for(int i=1; i<=n; i++){ // cout << i << ' '<< dp[i][1][1] << ' ' << dp[i][1][0] << ' ' << dp[i][0][1] << ' ' << dp[i][0][0] << '\n'; // } }

Compilation message (stderr)

xanadu.cpp: In function 'void dfs(long long int, long long int)':
xanadu.cpp:51:16: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   51 |  for(int i=0; i<vec[1][1].size(); i++){
      |               ~^~~~~~~~~~~~~~~~~
xanadu.cpp:76:16: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   76 |  for(int i=0; i<vec[1][0].size(); i++){
      |               ~^~~~~~~~~~~~~~~~~
xanadu.cpp:101:16: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  101 |  for(int i=0; i<vec[0][0].size(); i++){
      |               ~^~~~~~~~~~~~~~~~~
xanadu.cpp:125:16: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  125 |  for(int i=0; i<vec[0][1].size(); i++){
      |               ~^~~~~~~~~~~~~~~~~
#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...