제출 #1291274

#제출 시각아이디문제언어결과실행 시간메모리
1291274simona1230Designated Cities (JOI19_designated_cities)C++20
0 / 100
4 ms572 KiB
#include <bits/stdc++.h> using namespace std; const long long maxn=2*1e5+5; long long n; vector<long long> v[maxn],a[maxn],b[maxn]; long long q; long long e[maxn]; long long sum; void read() { cin>>n; for(long long i=1;i<n;i++) { long long v1,v2,d1,d2; cin>>v1>>v2>>d1>>d2; v[v1].push_back(v2); v[v2].push_back(v1); a[v1].push_back(d1); b[v1].push_back(d2); a[v2].push_back(d2); b[v2].push_back(d1); sum+=d1; sum+=d2; } cin>>q; for(long long i=1;i<=q;i++) cin>>e[i]; } long long up[maxn],dw[maxn]; long long vl[maxn]; long long maxx[maxn]; void dfs(long long i,long long p) { for(long long j=0;j<v[i].size();j++) { long long nb=v[i][j]; if(nb==p)continue; dfs(nb,i); up[i]+=up[nb]+b[i][j]; dw[i]+=dw[nb]+a[i][j]; maxx[i]=max(maxx[i],maxx[nb]+a[i][j]); } } long long ans,ans2; void dfs1(long long i,long long p) { long long v1=-1,v2=-1; for(long long j=0;j<v[i].size();j++) { long long nb=v[i][j]; if(nb==p)continue; vl[nb]=vl[i]-b[i][j]+a[i][j]; ans=max(ans,vl[nb]); dfs1(nb,i); if(v1==-1||v1<=maxx[nb]+a[i][j]) { v2=v1; v1=maxx[nb]+a[i][j]; } else if(v2==-1||v2<=maxx[nb]+a[i][j]) { v2=maxx[nb]+a[i][j]; } } if(v1!=-1&&v2!=-1) { ans2=max(ans2,vl[i]+v1+v2); } } int s; void solve1() { if(n==2) { for(int i=1;i<=q;i++) if(e[i]==1) cout<<min(a[1][0],b[1][0])<<endl; else cout<<0<<endl; return; } for(int i=1;i<=n;i++) if(v[i].size()>=2)s=i; dfs(s,0); ans=vl[s]=up[s]; dfs1(s,0); if(q==1&&e[1]==2)ans=ans2; if(q==1&&e[1]==1||q==1&&e[1]==2) { cout<<sum-ans<<endl; exit(0); } } vector<int> l; bool on[maxn]; int in[maxn]; int curr,qr; void dfsc(int i,int p) { in[i]=0; if(on[i])in[i]++; for(int j=0;j<v[i].size();j++) { int nb=v[i][j]; if(nb==p)continue; dfsc(nb,i); if(in[nb]!=0) { curr+=a[i][j]; } if(in[nb]!=qr) { curr+=b[i][j]; } in[i]+=in[nb]; } } int ansp; void rec(int i) { if(i==l.size()) { curr=0; dfsc(s,0); if(in[s]==qr) { /*cout<<curr<<": "; for(int j=1;j<=n;j++) cout<<in[j]<<" "; cout<<endl;*/ ansp=max(ansp,curr); } return; } on[l[i]]=1; rec(i+1); on[l[i]]=0; rec(i+1); } void brute() { solve1(); for(int i=1;i<=n;i++) { if(v[i].size()>=2)s=i; if(v[i].size()==1) l.push_back(i); } for(int i=1;i<=q;i++) { qr=e[i]; if(qr==1) { cout<<sum-ans<<endl; continue; } ansp=0; rec(0); cout<<sum-ansp<<endl; } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); read(); //solve1(); brute(); 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...
#Verdict Execution timeMemoryGrader output
Fetching results...