Submission #526904

#TimeUsernameProblemLanguageResultExecution timeMemory
526904wildturtleDesignated Cities (JOI19_designated_cities)C++17
100 / 100
1085 ms72108 KiB
#include<bits/stdc++.h> #define ll long long #define f first #define sc second #define pb push_back using namespace std; ll a,b,c,d,i,e,f,g,n,m,k,l; ll t,maxroot,fotlebi,wvrt,sum,idx; pair < pair <ll,ll> , pair <ll,ll> > A[200005]; ll in[200005],out[200005],P[200005],D[200005],down[200005],inv[200005]; ll lz[800005]; pair <ll,ll> tree[800005],pr; ll ans[200005],fix[200005]; vector < pair < ll, pair <ll,ll> > > v[200005]; void build(ll node,ll le,ll ri) { lz[node]=0; if(le==ri) { tree[node].f=0; tree[node].sc=le; return; } build(2*node,le,(le+ri)/2); build(2*node+1,(le+ri)/2+1,ri); if(tree[2*node].f>tree[2*node+1].f) tree[node]=tree[2*node]; else tree[node]=tree[2*node+1]; } void update(ll node,ll le,ll ri,ll start,ll end,ll val) { if(lz[node]) { tree[node].f+=lz[node]; if(le!=ri) { lz[2*node]+=lz[node]; lz[2*node+1]+=lz[node]; } lz[node]=0; } if(ri<start || le>end) return; if(start<=le && ri<=end) { tree[node].f+=val; if(le!=ri) { lz[2*node]+=val; lz[2*node+1]+=val; } return; } update(2*node,le,(le+ri)/2,start,end,val); update(2*node+1,(le+ri)/2+1,ri,start,end,val); if(tree[2*node].f>tree[2*node+1].f) tree[node]=tree[2*node]; else tree[node]=tree[2*node+1]; } pair <ll,ll> getmax(ll node,ll le,ll ri,ll start,ll end) { if(lz[node]) { tree[node].f+=lz[node]; if(le!=ri) { lz[2*node]+=lz[node]; lz[2*node+1]+=lz[node]; } lz[node]=0; } if(ri<start || le>end) return {-1,-1}; if(start<=le && ri<=end) { return tree[node]; } pair <ll,ll> pr1=getmax(2*node,le,(le+ri)/2,start,end); pair <ll,ll> pr2=getmax(2*node+1,(le+ri)/2+1,ri,start,end); if(pr1.f>pr2.f) return pr1; else return pr2; } void dfs(ll x,ll y,ll dist) { //cout<<x<<" "<<y<<" "<<dist<<endl; t++; in[x]=t; D[x]=dist; P[x]=y; inv[t]=x; down[x]=D[x]-D[y]; if(x!=maxroot && v[x].size()==1 && maxroot!=0) fotlebi++; update(1,1,n,in[x],in[x],D[x]); //cout<<x<<" "<<in[x]<<" "<<D[x]<<endl; for(ll i=0;i<v[x].size();i++) { if(v[x][i].f==y) continue; dfs(v[x][i].f,x,dist+v[x][i].sc.f); wvrt+=v[x][i].sc.sc; } out[x]=t; } void dfs1(ll x,ll y) { ans[1]=max(ans[1],wvrt); pr=getmax(1,1,n,1,n); //cout<<x<<"_"<<wvrt<<"_"<<pr.f<<endl; if(ans[2]<wvrt+pr.f) { ans[2]=wvrt+pr.f; maxroot=x; } for(ll i=0;i<v[x].size();i++) { if(v[x][i].f==y) continue; ll yx=v[x][i].sc.f; ll xy=v[x][i].sc.sc; wvrt=wvrt+yx-xy; update(1,1,n,in[v[x][i].f],out[v[x][i].f],-yx); update(1,1,n,1,in[v[x][i].f]-1,xy); update(1,1,n,out[v[x][i].f]+1,n,xy); dfs1(v[x][i].f,x); wvrt=wvrt-yx+xy; update(1,1,n,in[v[x][i].f],out[v[x][i].f],+yx); update(1,1,n,1,in[v[x][i].f]-1,-xy); update(1,1,n,out[v[x][i].f]+1,n,-xy); } } int main() { std::ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0); cin>>n; for(ll i=1;i<n;i++) { cin>>A[i].f.f>>A[i].f.sc>>A[i].sc.f>>A[i].sc.sc; v[A[i].f.f].pb({A[i].f.sc,{A[i].sc.f,A[i].sc.sc}}); v[A[i].f.sc].pb({A[i].f.f,{A[i].sc.sc,A[i].sc.f}}); sum+=A[i].sc.f+A[i].sc.sc; } build(1,1,n); dfs(1,0,0); //cout<<"*"; return 0; dfs1(1,0); build(1,1,n); t=0; //cout<<maxroot<<endl; dfs(maxroot,0,0); for(ll i=2;i<=fotlebi+1;i++) { pr=getmax(1,1,n,1,n); if(i!=2) ans[i]=ans[i-1]+pr.f; //cout<<ans[i]<<" "; idx=inv[pr.sc]; //cout<<pr.f<<" "<<pr.sc<<" "<<idx<<endl; while(idx!=maxroot && fix[idx]==0) { fix[idx]=1; update(1,1,n,in[idx],out[idx],-down[idx]); idx=P[idx]; } } cin>>t; while(t--) { cin>>f; if(f>fotlebi) cout<<0<<endl; else cout<<sum-ans[f]<<endl; } } /* 4 1 2 1 2 1 3 3 4 1 4 5 6 2 1 2 */

Compilation message (stderr)

designated_cities.cpp: In function 'void dfs(long long int, long long int, long long int)':
designated_cities.cpp:77:14: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, std::pair<long long int, long long int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   77 |  for(ll i=0;i<v[x].size();i++) {
      |             ~^~~~~~~~~~~~
designated_cities.cpp: In function 'void dfs1(long long int, long long int)':
designated_cities.cpp:89:14: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, std::pair<long long int, long long int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |  for(ll i=0;i<v[x].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...
#Verdict Execution timeMemoryGrader output
Fetching results...