首页 > 其他分享 >P3066 [USACO12DEC] Running Away From the Barn G

P3066 [USACO12DEC] Running Away From the Barn G

时间:2024-12-25 21:57:16浏览次数:4  
标签:USACO12DEC cnt P3066 int leq Running ls 节点 dis

P3066 [USACO12DEC] Running Away From the Barn G

题目描述

给定一颗 \(n\) 个点的有根树,边有边权,节点从 \(1\) 至 \(n\) 编号,\(1\) 号节点是这棵树的根。

再给出一个参数 \(t\),对于树上的每个节点 \(u\),请求出 \(u\) 的子树中有多少节点满足该节点到 \(u\) 的距离不大于 \(t\)。

输入格式

输入的第一行是两个整数,分别表示节点数 \(n\) 和给出的参数 \(t\)。

第 \(2\) 到第 \(n\) 行,每行两个整数,第 \(i\) 行的整数 \(p_i, w_i\) 表示节点 \(i\) 的父节点为 \(p_i\),连结 \(i\) 与 \(p_i\) 的边的边权为 \(w_i\)。

输出格式

输出 \(n\) 行,每行一个整数,第 \(i\) 行的整数表示 \(i\) 的子树内到 \(i\) 的距离不大于 \(t\) 的节点个数。

数据规模与约定

对于全部的测试点,保证:

  • \(1 \leq n \leq 2 \times 10^5\),\(1 \leq t \leq 10^{18}\)。
  • \(1 \leq p_i \lt i\),\(1 \leq w_i \leq 10^{12}\)。

Solution:

线段树合并板子捏。

我们先对这整颗树求出每个点到根的距离 \(dis_{u}\) 然后对每个节点开一颗权值线段树,维护当前子树下的每个 \(dis\) 区间内的点的个数,那么到u距离不超过t就等价于:

\(dis\in[0,dis_{u}+t]\)

然后我们发现每个点都开一颗权值线段树然后遍历子树更新肯定是不行的,所以我们需要线段树合并。

然后这题就做完了

然后这题貌似还有个弱化版本this

Code:

#include<bits/stdc++.h>
#define int long long
const int N=2e5+5;
const int inf=1e17;
using namespace std;
struct Segment_Tree{
    int cnt,rt[N];
    struct Tree{
        int ls,rs,cnt;
    }t[N*40];
    void pushup(int x)
    {
        t[x].cnt=t[t[x].ls].cnt+t[t[x].rs].cnt;
    }
    void insert(int &x,int l,int r,int pos)
    {
        if(!x)x=++cnt;
        t[x].cnt++;
        if(l==r)return;
        int mid=l+r>>1;
        if(pos<=mid)insert(t[x].ls,l,mid,pos);
        if(mid<pos) insert(t[x].rs,mid+1,r,pos);
    }
    int merge(int x,int y,int l,int r)
    {
        if(!x||!y)return x|y;
        if(l==r)
        {
            t[x].cnt+=t[y].cnt;
            return x;
        }
        int mid=l+r>>1;
        t[x].ls=merge(t[x].ls,t[y].ls,l,mid);
        t[x].rs=merge(t[x].rs,t[y].rs,mid+1,r);
        pushup(x);
        return x;
    }
    int query(int x,int l,int r,int L,int R)
    {
        if(L<=l&&r<=R)
        {
            //cout<<"query:"<<l<<" "<<r<<"="<<t[x].cnt<<"\n";
            return t[x].cnt;
        }
        int mid=l+r>>1,res=0;
        if(L<=mid)res+=query(t[x].ls,l,mid,L,R);
        if(mid<R)res+=query(t[x].rs,mid+1,r,L,R);
        return res;
    }
}T;
int n,m;
vector<tuple<int,int> > E[N];
int dis[N],a[N],b[N],ans[N];
void dfs(int x)
{
    for(auto [y,w] :E[x])
    {
        dis[y]=dis[x]+w;
        dfs(y);
    }
}
void calc(int x)
{
    T.insert(T.rt[x],1,n,dis[x]);
    //cout<<"upd:"<<T.rt[x]<<" "<<dis[x]<<"\n";
    for(auto [y,w] : E[x])
    {
        calc(y);
        //cout<<"merge:"<<x<<" "<<y<<"="<<T.rt[x]<<" "<<T.rt[y]<<"\n";
        T.rt[x]=T.merge(T.rt[x],T.rt[y],1,n);
    }
    ans[x]=T.query(T.rt[x],1,n,1,a[x]);
    //cout<<"ans : "<<x<<" : "<<dis[x]<<"="<<ans[x]<<"\n";
}
void work()
{
    cin>>n>>m;
    for(int i=1,x,y;i<n;i++)
    {
        scanf("%lld%lld",&x,&y);
        E[x].emplace_back(i+1,y);
    }
    dfs(1);
    for(int i=1;i<=n;i++)b[i]=dis[i];
    b[n+1]=inf;
    sort(b+1,b+2+n);
    int tot=unique(b+1,b+2+n)-(b+1);
    for(int i=1;i<=n;i++)
    {
        a[i]=dis[i]+m;
        int k=lower_bound(b+1,b+1+tot,dis[i])-b-1,kk=lower_bound(b+1,b+1+tot,a[i])-b-1;
        dis[i]= dis[i]==b[k+1] ? k+1 : k;
        a[i]= a[i]==b[kk+1] ? kk+1 : kk;
    }
    calc(1);
    for(int i=1;i<=n;i++)printf("%lld\n",ans[i]);
}
#undef int
int main()
{
    //freopen("run.in","r",stdin);
    //freopen("run.out","w",stdout);
    work();
    return 0;
}

标签:USACO12DEC,cnt,P3066,int,leq,Running,ls,节点,dis
From: https://www.cnblogs.com/LG017/p/18631513

相关文章

  • WSL2 ubuntu18.04 使用xfce4时Xlaunch黑屏问题以及解决,X server already running on d
    显示xfce4启动成功却没有画面显示在Ubuntu终端输入startxfce4启动X服务时,显示:/usr/bin/startxfce4:Xserveralreadyrunningondisplay10.255.255.254:0,且Xlaunch黑屏无输入。如图所示:分析原因:出现Xserveralreadyrunningondisplay10.255.255.254:0说明X服务......
  • flutter项目运行卡在Running Gradle task 'assembleDebug'?
    flutter项目运行卡在RunningGradletask'assembleDebug'?也修改了项目build.gradle和flutter.gradle文件,替换为阿里地址,还是卡在那,没用呀?flutter/packages/flutter_tools/gradle/resolve_dependencies.gradle改为url"http://download.flutter.io"flutter/packages/flutte......
  • zabbix-server is not running 报错解决
    前提是我什么都没动zabbix-server,只是加主机关联模板等等,一定要仔细地看日志、看报错!!!(我也是,只是添加了几台交换机,就报错了)页面报错如下: 用命令查看状态systemctlstatuszabbix-server,如下 systemctlrestartzabbix-server也不行systemctlrestartzabbix-serverzab......
  • 进程已结束,退出代码为 -1073740791 (0xC0000409)。QThread: Destroyed while thread i
            在使用pycharm写代码发现代码运行不了,进程已结束,退出代码为-1073740791(0xC0000409),但是又不提示具体错在哪。为了得到更加清晰的错误原因,可如下操作:        ①点击debug旁边的三个小点moreactions,点击编辑。        ②勾选在控制台中......
  • 解决podman: ERRO[0000] running newuidmap: write to uid_map failed: Invalid argum
    报错ERRO[0000]running/usr/bin/newuidmap27115520100011100000655366553710000065537:newuidmap:writetouid_mapfailed:InvalidargumentError:cannotsetupnamespaceusing"/usr/bin/newuidmap":shouldhavesetuidorhavefilecapssetu......
  • IDEA报错:Error running 'XXXApplication' Error running XXXXApplication. Command li
     IDEA启动SpringBoot项目报错Errorrunning'XXXApplication'ErrorrunningXXXXApplication.Commandlineistoolong.ShortenthecommandlineviaJARmanifestorviaaclasspathfileandrerun   点击在高版本IDEA下只需要点击就会自动选择  低版本......
  • ModuleNotFoundError: No module named 'dnf' when running yum or dnf
    这两天干了一件很坑的事情:把 linux服务器自带的python3.6卸载了,然后就用不了yum和dnf了。所用的命令和大致经过和这个帖子几乎一模一样: Ihaveafriendwhometthesameproblem.Hetriedtouninstall python3.7 inlinuxserverbysomeamazingcmd rpm-qa|......
  • 问题--Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the
     上班后发现服务不在线,docker也无法启动,检查daemon.json配置文件出问题了 。 检查:#查看docker内全部进程dockerps提示错误:CannotconnecttotheDockerdaemonatunix:///var/run/docker.sock.TSthedockerdaemonrunning? #查看docker状态systemctls......
  • 安装双系统(Ubuntu)后NVIDIA驱动无法使用(Make sure that the latest NVIDIA driver is i
    首先问题描述:使用nvidia-smi命令去查看Nvidia显卡的使用情况的时候报错如下:(base)root@TGONE:#nvidia-smiNVIDIA-SMIhasfailedbecauseitcouldn'tcommunicatewiththeNVIDIAdriver.MakesurethatthelatestNVIDIAdriverisinstalledandrunning.引言在......
  • Luogu P5563 [Celeste-B] No More Running
    Celeste,启动!稍作思考就会发现这题其实很简单,树上路径一眼考虑点分治对于分治中心,很容易预先求出所有未处理的点到它的距离(模意义下),可以用这些信息来更新中心的答案考虑剩下的某个未处理的点\(x\),它的答案可能由\(x\)到分治中心的距离\(dis_x\),拼上分治中心到另一个点\(y\)......