제출 #1291304

#제출 시각아이디문제언어결과실행 시간메모리
1291304simona1230Designated Cities (JOI19_designated_cities)C++20
0 / 100
2097 ms55988 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 up1[maxn],dw1[maxn]; long long vl[maxn]; void dfs2(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; dfs2(nb,i); up1[i]+=up1[nb]+b[i][j]; dw1[i]+=dw1[nb]+a[i][j]; } } long long ans3; void dfs12(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; vl[nb]=vl[i]-b[i][j]+a[i][j]; ans3=max(ans3,vl[nb]); dfs12(nb,i); } } void solve1() { dfs2(1,0); ans3=vl[1]=up1[1]; dfs12(1,0); } long long up,dw[maxn]; long long u[maxn]; long long num,in[maxn],out[maxn]; long long op[maxn]; long long t[4*maxn],td[4*maxn]; long long lz[4*maxn]; void build(long long i,long long l,long long r) { if(l==r) { t[i]=op[l]; td[i]=dw[op[l]]; return; } long long m=(l+r)/2; build(i*2,l,m); build(i*2+1,m+1,r); if(dw[t[i*2]]>dw[t[i*2+1]])t[i]=t[i*2],td[i]=td[i*2]; else t[i]=t[i*2+1],td[i]=td[i*2+1]; } void push(long long i,long long l,long long r) { td[i]+=lz[i]; if(l!=r) { lz[i*2]+=lz[i]; lz[i*2+1]+=lz[i]; } lz[i]=0; } void update(long long i,long long l,long long r,long long ql,long long qr,long long vl) { push(1,1,n); if(ql>qr)return; if(ql<=l&&r<=qr) { lz[i]+=vl; push(1,1,n); return; } long long m=(l+r)/2; update(i*2,l,m,ql,min(qr,m),vl); update(i*2+1,m+1,r,max(m+1,ql),qr,vl); if(td[i*2]>td[i*2+1])t[i]=t[i*2],td[i]=td[i*2]; else t[i]=t[i*2+1],td[i]=td[i*2+1]; } // t[i] = the original id of the vertex which is the furthest in l-r long long par[maxn],val[maxn]; void use(long long i) { if(u[i]||par[i]==0)return; update(1,1,n,in[i],out[i],-val[i]); u[i]=1; use(par[i]); } void dfs(long long i,long long p) { in[i]=num++; op[num-1]=i; par[i]=p; for(long long j=0;j<v[i].size();j++) { long long nb=v[i][j]; if(nb==p)continue; val[nb]=a[i][j]; dw[nb]=dw[i]+a[i][j]; dfs(nb,i); up+=b[i][j]; } out[i]=num; } long long cnt; long long ans[2001]; void prec() { for(long long i=1;i<=n;i++) { if(v[i].size()>=2)continue; cnt++; num=1; up=0; dw[i]=0; dfs(i,0); build(1,1,n); long long curs=0; ans[0]=max(ans[0],up); for(long long j=1;j<=n-1;j++) { push(1,1,n); curs+=td[1]; use(t[1]); ans[j]=max(ans[j],up+curs); } } } void solve() { for(long long i=1;i<=q;i++) { if(e[i]==1)cout<<sum-ans3<<endl; else if(e[i]>=cnt)cout<<0<<endl; else cout<<sum-ans[e[i]-1]<<endl; } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); read(); prec(); solve1(); solve(); 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...