Submission #1232395

#TimeUsernameProblemLanguageResultExecution timeMemory
1232395alexander707070Petrol stations (CEOI24_stations)C++20
18 / 100
62 ms33348 KiB
#include<bits/stdc++.h> #define MAXN 70007 using namespace std; const int inf=2e9; struct edge{ int to,cost; }; int n,K,a,b,c; long long ans[MAXN],sz[MAXN]; vector<edge> v[MAXN]; void calc(int x,int p){ sz[x]=1; for(auto e:v[x]){ if(e.to==p)continue; calc(e.to,x); sz[x]+=sz[e.to]; } } void dfs(int x,int p,int up,long long d){ if(d<0){ ans[p]+=sz[x]; d=K-up; } for(auto e:v[x]){ if(e.to==p)continue; dfs(e.to,x,e.cost,d-e.cost); } } void solve_slow(){ for(int i=1;i<=n;i++){ calc(i,0); dfs(i,0,0,K); } for(int i=1;i<=n;i++){ cout<<ans[i]<<"\n"; } } int ed[MAXN],m,to[MAXN]; vector<int> tree[MAXN]; int ver[MAXN]; void dfs2(int x,int p){ for(auto e:v[x]){ if(e.to==p)continue; m++; ed[m]=e.cost; ver[m]=x; ver[m+1]=e.to; dfs2(e.to,x); } } void dfs3(int x){ sz[x]=1; for(int i:tree[x]){ dfs3(i); sz[x]+=sz[i]; } } void solve_line(){ for(int i=1;i<=n;i++){ if(v[i].size()==1){ dfs2(i,0); break; } } int pt=1,sum=ed[1]; for(int i=1;i<=m;i++){ while(pt<m and sum+ed[pt+1]<=K){ pt++; sum+=ed[pt]; } to[i]=pt+1; sum-=ed[i]; } for(int i=1;i<=m;i++){ tree[to[i]].push_back(i); } dfs3(n); for(int i=1;i<=n;i++){ ans[ver[i]]+=(long long) (sz[i]-1) * (n-i); tree[i].clear(); } reverse(ed+1,ed+m+1); reverse(ver+1,ver+n+1); pt=1; sum=ed[1]; for(int i=1;i<=m;i++){ while(pt<m and sum+ed[pt+1]<=K){ pt++; sum+=ed[pt]; } to[i]=pt+1; sum-=ed[i]; } for(int i=1;i<=m;i++){ tree[to[i]].push_back(i); } dfs3(n); for(int i=1;i<=n;i++){ ans[ver[i]]+=(long long) (sz[i]-1) * (n-i); } for(int i=1;i<=n;i++){ cout<<ans[i]<<"\n"; } } long long down[MAXN][11],up[MAXN][11],all[MAXN][11]; void dfs4(int x,int p){ for(auto e:v[x]){ if(e.to==p)continue; dfs4(e.to,x); } for(int t=0;t<=K;t++){ for(auto e:v[x]){ if(t+e.cost<=K)down[x][t]+=down[e.to][t+e.cost]; if(t+e.cost==K){ for(int s=e.cost-1;s>=0;s--)down[x][t]+=down[e.to][s]; } } } down[x][K]++; } void dfs5(int x,int p,int e){ if(p!=0){ for(int t=0;t<=K;t++){ if(t+e<=K)up[x][t]+=up[p][t+e]; if(t+e==K){ for(int s=e-1;s>=0;s--)up[x][t]+=up[p][s]; } } for(int t=0;t<=K;t++){ if(t+e<=K)down[p][t]-=down[x][t+e]; if(t+e==K){ for(int s=e-1;s>=0;s--)down[p][t]-=down[x][s]; } } down[p][K]--; for(int t=0;t<=K;t++){ if(t+e<=K)up[x][t]+=down[p][t+e]; if(t+e==K){ for(int s=e-1;s>=0;s--)up[x][t]+=down[p][s]; } } down[p][K]++; for(int t=0;t<=K;t++){ if(t+e<=K)down[p][t]+=down[x][t+e]; if(t+e==K){ for(int s=e-1;s>=0;s--)down[p][t]+=down[x][s]; } } } up[x][K]++; for(auto e:v[x]){ if(e.to==p)continue; dfs5(e.to,x,e.cost); } for(int t=0;t<=K;t++){ all[x][t]=down[x][t]+up[x][t]; } all[x][K]--; } void dfs6(int x,int p){ cout<<x<<" "<<p<<"\n"; for(auto e:v[x]){ if(e.to==p)continue; dfs6(e.to,x); } for(auto e:v[x]){ long long szz=0; if(e.to!=p){ szz=sz[e.to]; for(int t=0;t<=K;t++){ if(t+e.cost<=K)all[x][t]-=down[e.to][t+e.cost]; if(t+e.cost==K){ for(int s=e.cost-1;s>=0;s--)all[x][t]-=down[e.to][s]; } } }else{ szz=n-sz[x]; for(int t=0;t<=K;t++){ all[x][t]-=up[x][t]; } } for(int f=0;f<e.cost;f++)ans[x]+=all[x][f]*szz; if(e.to!=p){ for(int t=0;t<=K;t++){ if(t+e.cost<=K)all[x][t]+=down[e.to][t+e.cost]; if(t+e.cost==K){ for(int s=e.cost-1;s>=0;s--)all[x][t]+=down[e.to][s]; } } }else{ for(int t=0;t<=K;t++){ all[x][t]+=up[x][t]; } } } } void solve_fast(){ calc(1,0); dfs4(1,0); dfs5(1,0,0); dfs6(1,0); for(int i=1;i<=n;i++){ cout<<ans[i]<<"\n"; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>K; for(int i=1;i<=n-1;i++){ cin>>a>>b>>c; a++; b++; v[a].push_back({b,c}); v[b].push_back({a,c}); } if(n<=1000){ solve_slow(); }else if(K<=10){ solve_fast(); }else{ solve_line(); } 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...
#Verdict Execution timeMemoryGrader output
Fetching results...