Submission #1232132

#TimeUsernameProblemLanguageResultExecution timeMemory
1232132PVM_pvmPetrol stations (CEOI24_stations)C++20
18 / 100
3592 ms11960 KiB
#include<bits/stdc++.h>
using namespace std;
#define MAXN 70'007
long long otg[MAXN];
int n,k;
long long st[MAXN],fen[MAXN];
void Update(int x, long long ch)
{
    while (x<=n)
    {
        fen[x]+=ch;
        x+=x&(-x);
    }
}
long long Query(int x)
{
    long long ans=0;
    while (x>0)
    {
        ans+=fen[x];
        x-=x&(-x);
    }
    return ans;
}
vector<pair<int,int>> v[MAXN];
vector<int> nm;
vector<long long> dst;
void dfs(int x, int par, long long dd)
{
    nm.push_back(x);
    dst.push_back(dd);
    for (int q=0;q<v[x].size();q++)
    {
        if (v[x][q].first==par) continue;
        dfs(v[x][q].first,x,dd+v[x][q].second);
    }
}
void solvefrom(int root)
{
    nm.clear();
    dst.clear();
    dfs(root,-1,0);
    for (int q=0;q<=n;q++) st[q]=0;
    for (int q=0;q<=n;q++) fen[q]=0;
    st[n-1]=n-1;
    Update(n,1);
    for (int q=n-2;q>0;q--)
    {
        long long reb=dst[q]-dst[q-1];
        int l=q,r=n;
        while (l<r-1)
        {
            int mid=(l+r)/2;
            long long raz=dst[mid]-dst[q];
            if (raz<=k) l=mid;
            else r=mid;
        }
        int desen=l;
        l=q;
        r=n;
        while (l<r-1)
        {
            int mid=(l+r)/2;
            long long raz=dst[mid]-dst[q];
            if (raz<=(k-reb)) l=mid;
            else r=mid;
        }
        //cout<<q<<" "<<l<<" "<<desen<<"\n";
        if (desen==q)
        {
            st[q]=q;
        }
        else
        {
            st[q]=q+1LL*q*(Query(desen+1)-Query(l+1));
        }
        //cout<<q<<" "<<st[q]<<"\n";
        Update(q+1,st[q]/q);
    }
    for (int q=0;q<n;q++) otg[ nm[q] ]+=st[q];
}
int main()
{
    cin>>n>>k;
    for (int q=0;q<n-1;q++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        v[a].push_back({b,c});
        v[b].push_back({a,c});
    }
    for (int q=0;q<n;q++)
    {
        if (v[q].size()==1)
        {
            solvefrom(q);
        }
    }
    for (int q=0;q<n;q++) cout<<otg[q]-n+1<<"\n";
}
#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...