제출 #1124132

#제출 시각아이디문제언어결과실행 시간메모리
1124132RSAMSDThe Xana coup (BOI21_xanadu)C++20
100 / 100
48 ms16968 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; int t = 0; int const f =1e5 + 10; long long mod = 1e9 + 7;//998244353; long long dp[f]; long long dp1[f]; long long dp2[f]; long long dp3[f]; // long long par1[f]; // long long par2[f]; long long a[f]; // long long adj[f]; // long long mmn =0; // long long C[4]; // pair<long long, long long> dd[f]; // long long prefix[f]; vector<int>g[f]; vector<pair<long long,long long>>gr; struct node { long long val = 0; long long lazy = 0; long long prefix =0; long long suffix =0; long long all =0; }; // struct trpel { // long long v, u, bank = 0; // }; node segtree[f *4]; bool B[f]; void redany() { ifstream fin; ofstream fout; fin.open("std.in"); fout.open("std.out"); } long long powmod(long long a, long long p, long long modd) { long long ans = 1; while (p > 0) { if (p % 2 == 1) { ans *= a; ans %= modd; p--; } if (p == 0)break; a *= a; a %= modd; p /= 2; } return ans; } void dolazy(int v){ long long k = segtree[v].lazy; segtree[v].lazy = 0; segtree[2*v].lazy+=k; segtree[2*v+1].lazy +=k; segtree[2*v].val+=k; segtree[2*v+1].val+=k; } void upd(int v, int tl, int tr, int l ,int r, int val){ if(tr<l||tl>r)return; if(tr<=r&&tl>=l){ segtree[v].val+=val; segtree[v].lazy+=val; return; } dolazy(v); int mid = (tl+tr)/2; upd(2*v,tl,mid,l,r,val); upd(2*v+1,mid+1,tr,l,r,val); segtree[v].val = max(segtree[2*v].val,segtree[2*v+1].val); } long long q(int v, int tl , int tr,int l , int x){ if(tr<l||segtree[v].val<x)return 1e18; if(tr==tl)return tr; int mid = (tr+tl)/2; dolazy(v); if(tl>=l&&segtree[v].val>=x){ if(segtree[v*2].val>=x){ return q(2*v,tl,mid,l,x); } return q(2*v+1,mid+1,tr,l,x); } return min(q(2*v,tl,mid,l,x),q(2*v+1,mid+1,tr,l,x)); } void dfs(int v, int parv){ for(int u:g[v]){ if(u==parv)continue; dfs(u,v); } if(g[v].size()==1&&parv!=0){ if(B[v]){ dp2[v] = 1e18; dp1[v] = 1e18; dp[v] = 1; dp3[v] = 0; } else{ dp[v] = dp3[v] = 1e18; dp1[v] = 1; dp2[v] =0; } //cout<<v<<" : "<<dp[v]<<" "<<dp1[v]<<" "<<dp2[v]<<" "<<dp3[v]<<'\n'; return; } long long a =0, b=0; // dp me yes off //dp1 me yes on // dp2 me no off // dp3 me no on bool c=0; dp[v] = 1; for(int u:g[v]){ if(u==parv)continue; if(min(dp1[u],dp3[u])==1e18){ c=1; //cout<<v<<'\n'; dp[v] = 1e18;break; } dp[v]+=min(dp1[u],dp3[u]); if(dp1[u]<dp3[u]){ a++; } else{ b++; } } if((a+1+B[v])%2==1&&!c){ a = b =1e18; for(int u:g[v]){ if(u==parv)continue; if(dp1[u]<dp3[u]){ if(dp3[u]!=1e18){ a = min(a,dp3[u]-dp1[u]); } } else{ if(dp1[u]!=1e18){ a = min(a,dp1[u]-dp3[u]); } } } if(a==1e18){ dp[v] = 1e18; } else{ dp[v]+=a; } } dp1[v] =1; a =0; c=0; for(int u:g[v]){ if(u==parv)continue; if(min(dp1[u],dp3[u])==1e18){ c=1; dp1[v] = 1e18;break; } dp1[v]+=min(dp1[u],dp3[u]); if(dp1[u]<dp3[u]){ a++; } else{ b++; } } if((a+1+B[v])%2==0&&!c){ a = b =1e18; for(int u:g[v]){ if(u==parv)continue; if(dp1[u]<dp3[u]){ if(dp3[u]!=1e18){ a = min(a,dp3[u]-dp1[u]); } } else{ if(dp1[u]!=1e18){ a = min(a,dp1[u]-dp3[u]); } } } if(a==1e18){ dp1[v] = 1e18; } else{ dp1[v]+=a; } } dp2[v] =0; a=0; c=0; for(int u:g[v]){ if(u==parv)continue; if(min(dp[u],dp2[u])==1e18){ c=1; dp2[v] = 1e18;break; } dp2[v]+=min(dp[u],dp2[u]); if(dp[u]<dp2[u]){ a++; } else{ b++; } } if((a+B[v])%2==1&&!c){ a = b =1e18; for(int u:g[v]){ if(u==parv)continue; if(dp[u]<dp2[u]){ if(dp2[u]!=1e18){ a = min(a,dp2[u]-dp[u]); } } else{ if(dp[u]!=1e18){ a = min(a,dp[u]-dp2[u]); } } } if(a==1e18){ dp2[v] = 1e18; } else{ dp2[v]+=a; } } dp3[v] = 0; a=0; c=0; for(int u:g[v]){ if(u==parv)continue; if(min(dp[u],dp2[u])==1e18){ c=1; dp3[v] = 1e18;break; } dp3[v]+=min(dp[u],dp2[u]); if(dp[u]<dp2[u]){ a++; } else{ b++; } } if((a+B[v])%2==0&&!c){ a = b =1e18; for(int u:g[v]){ if(u==parv)continue; if(dp[u]<dp2[u]){ if(dp2[u]!=1e18){ a = min(a,dp2[u]-dp[u]); } } else{ if(dp[u]!=1e18){ a = min(a,dp[u]-dp2[u]); } } } if(a==1e18){ dp3[v] = 1e18; } else{ dp3[v]+=a; } } //cout<<v<<" : "<<dp[v]<<" "<<dp1[v]<<" "<<dp2[v]<<" "<<dp3[v]<<'\n'; } long long tw = powmod(2, mod - 2, mod); int main() { ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); t = 1; //cin >> t; for (int hhh = 1;hhh <= t;hhh++) { long long n, mx = 0, d = 0, m = 0, k = 0, k2 = 1, r = 0, rr = 0, l = 0, ll = 0, lll = 0, rrr = 0, inf = 1e18; string s1; string s3; char s2; long double dec = 0; bool c = 1; bool allrows =0; bool allculms =0; pair<long long,long long> aa; priority_queue<pair<long long, long long>> qq; multiset<long long> mul; multiset<long long> mul2; set<long long>st; queue<long long> pp; map<long long, long long> conv; map<long long,long long> convback; vector<long long> vec; cin >>n; for(int i =0;i<n-1;i++){ cin>>r>>l; g[r].push_back(l); g[l].push_back(r); } for(int i =1;i<=n;i++){ cin>>B[i]; } dfs(1,0); if(min(dp[1],dp2[1])==1e18) cout<<"impossible"; else cout<<min(dp[1],dp2[1]); // m = 1e12; // cout<<m%mod; } } //kir
#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...