G. Path Prefixes

原题链接

题解

深搜带上 suma ,然后把经过的 sumb 放入栈里, 二分查找

code

#define ll long long
#include<bits/stdc++.h>
using namespace std;

inline void read(ll &x) {
	x = 0;
	ll flag = 1;
	char c = getchar();
    while(c < '0' || c > '9'){
        if(c == '-')flag = -1;
        c = getchar();
    }
	while(c >= '0' && c <= '9') {
		x = (x << 3) + (x << 1) + (c ^ 48);
		c = getchar();
	}
	x *= flag;
}

inline void write(ll x)
{
    if(x < 0){
    	putchar('-');
		x = -x;
	}
    if(x > 9)
		write(x / 10);
    putchar(x % 10 + '0');
}

struct node
{
    ll to,blue,red;
};
vector<node> G[200005];
vector<ll> st;
ll ans[200006]={0};
void dfs(ll now,ll sum)
{
    ans[now]=upper_bound(st.begin(),st.end(),sum)-st.begin();//找到最后一个小于等于sum的值
    for(auto next:G[now])
    {
        ll to=next.to,a=next.blue,b=next.red;
        if(st.size())st.push_back(st.back()+b);
        else st.push_back(b);
        dfs(to,sum+a);
        st.pop_back();
    }
}
int main()
{
    ll t;
    read(t);
    while(t--)
    {
        ll n;
        read(n);
        for(ll i=2;i<=n;i++)
        {
            ll x,y,w;
            read(x); read(y); read(w);
            G[x].push_back({i,y,w});
        }

        dfs(1,0);
        G[1].clear();
        for(ll i=2;i<=n;i++)
        {
            write(ans[i]);
            putchar(' ');
            G[i].clear();
        }
        puts("");
    }

    return 0;
}

posted @   纯粹的  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示