제출 #126475

#제출 시각아이디문제언어결과실행 시간메모리
126475TadijaSebezDesignated Cities (JOI19_designated_cities)C++11
100 / 100
641 ms50864 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back const int N=200050; vector<pair<int,int>> E[N]; ll sum[N],all_up; int up[N],down[N]; ll dep[N]; int lid[N],rid[N],tid,nod[N],par[N],my[N],rt,n; ll mxd[N],sol[N]; void DFS(int u, int p) { for(auto e:E[u]) { int v=e.first,w=e.second; if(v==p) up[u]=w,all_up+=w; } if(p) sum[u]=sum[p]+down[u]-up[u]; mxd[u]=0; for(auto e:E[u]) { int v=e.first,w=e.second; if(v!=p) { down[v]=w; dep[v]=dep[u]+w; DFS(v,u); mxd[u]=max(mxd[u],mxd[v]+w); } } } void Solve(int u, int p, ll hi) { ll fir=0,sec=0; int t=-1; sol[u]=max(hi,mxd[u])+sum[u]; for(auto e:E[u]) if(e.first!=p) { int v=e.first,w=e.second; if(fir<mxd[v]+w) sec=fir,fir=mxd[v]+w,t=v; else if(sec<mxd[v]+w) sec=mxd[v]+w; } for(auto e:E[u]) if(e.first!=p) { int v=e.first,w=e.second; ll best=hi; if(t==v) best=max(best,sec); else best=max(best,fir); Solve(v,u,best+up[v]); } } void DFS2(int u, int p) { lid[u]=++tid; nod[tid]=u; par[u]=p; my[u]=u; for(auto e:E[u]) if(e.first!=p) { int v=e.first; dep[v]=dep[u]+e.second; DFS2(v,u); if(dep[my[u]]<dep[my[v]]) my[u]=my[v]; } rid[u]=tid; } const int M=2*N; int ls[M],rs[M],tsz,root,id[M]; ll mx[M],lzy[M]; void Build(int &c, int ss, int se) { c=++tsz; if(ss==se){ mx[c]=dep[nod[ss]];id[c]=nod[ss];return;} int mid=ss+se>>1; Build(ls[c],ss,mid); Build(rs[c],mid+1,se); mx[c]=max(mx[ls[c]],mx[rs[c]]); if(mx[c]==mx[ls[c]]) id[c]=id[ls[c]]; else id[c]=id[rs[c]]; //printf("%i %lld %i\n",c,mx[c],id[c]); } void Add(int c, int ss, int se, int qs, int qe, ll x) { if(qs>qe || qs>se || ss>qe) return; if(qs<=ss && qe>=se){ mx[c]+=x;lzy[c]+=x;return;} int mid=ss+se>>1; Add(ls[c],ss,mid,qs,qe,x); Add(rs[c],mid+1,se,qs,qe,x); mx[c]=max(mx[ls[c]],mx[rs[c]]); if(mx[c]==mx[ls[c]]) id[c]=id[ls[c]]; else id[c]=id[rs[c]]; mx[c]+=lzy[c]; } bool was[N]; ll ans[N],cur; void Add(int x) { for(;!was[x];x=par[x]) { was[x]=1; Add(root,1,n,lid[x],rid[x],-dep[x]+dep[par[x]]); cur+=dep[x]-dep[par[x]]; } } int main() { int q,u,v,c,d; scanf("%i",&n); ll z=0; for(int i=1;i<n;i++) { scanf("%i %i %i %i",&u,&v,&c,&d); E[u].pb({v,c}); E[v].pb({u,d}); z+=c; z+=d; } DFS(1,0); rt=1; for(int i=1;i<=n;i++) { sum[i]+=all_up; if(sum[i]>sum[rt]) rt=i; } ans[1]=sum[rt]; Solve(1,0,0); for(int i=1;i<=n;i++) if(sol[i]>sol[rt]) rt=i; //ans[2]=sol[rt]; for(int i=1;i<=n;i++) dep[i]=0; DFS2(rt,0); Build(root,1,n); cur=sum[rt]; //printf("cur:%lld\n",cur); /*int fir=0,sec=0; for(auto e:E[rt]) { v=e.first; if(dep[my[v]]>dep[fir]) sec=fir,fir=my[v]; else if(dep[my[v]]>dep[sec]) sec=my[v]; } Add(fir); if(sec) Add(sec);*/ was[rt]=1; for(int i=2;i<=n;i++) { //printf("%i: %i\n",i,id[root]); if(id[root]!=rt) Add(id[root]); ans[i]=max(ans[i],cur); } scanf("%i",&q); while(q--) { int x; scanf("%i",&x); printf("%lld\n",z-ans[x]); } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

designated_cities.cpp: In function 'void Solve(int, int, long long int)':
designated_cities.cpp:46:17: warning: unused variable 'w' [-Wunused-variable]
   int v=e.first,w=e.second;
                 ^
designated_cities.cpp: In function 'void Build(int&, int, int)':
designated_cities.cpp:75:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid=ss+se>>1;
          ~~^~~
designated_cities.cpp: In function 'void Add(int, int, int, int, int, long long int)':
designated_cities.cpp:87:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid=ss+se>>1;
          ~~^~~
designated_cities.cpp: In function 'int main()':
designated_cities.cpp:109:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%i",&n);
  ~~~~~^~~~~~~~~
designated_cities.cpp:113:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%i %i %i %i",&u,&v,&c,&d);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
designated_cities.cpp:151:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%i",&q);
  ~~~~~^~~~~~~~~
designated_cities.cpp:155:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%i",&x);
   ~~~~~^~~~~~~~~
#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...