题目链接

题目大意:

有一棵N个结点树和N头奶牛,一开始所有奶牛都在一号结点,奶牛们将按从编号1到编号N的顺序依次前往自己的目的地,求每头奶牛在去往自己目的地的途中将会经过多少已经有奶牛的结点。

题解:

可以发现,每一头奶牛到达目的地后,都只会对还未到达目的地的奶牛中,目的地在它目的地子树中的奶牛的答案产生贡献。

比如说在下面这棵树中,一头奶牛到达了图中深色结点,那么在还未到达目的地的奶牛中,只有目的地在深色结点子树中的奶牛才会由深色结点对答案产生贡献。

所以,我们可以在每头奶牛到达目的地后,将其目的地所在结点的子树中每一个结点的权值都加上一,询问时输出该奶牛目的地所在结点的权值即可。

由于每一次的修改操作都是在一棵子树内进行的,所以考虑用dfs序给结点编号(因为每棵子树中结点的dfs序都一定是连续的一段),再用线段树进行维护就好。

代码:

#include<iostream>
#include<cstdio>
using namespace std;
struct edge
{
int last;
int end;
}e[200005];
int ne=0,idx=0,dfn[100005],note[100005],size[100005],tree[400005],lazy[400005];
void make_edge(int u,int v)
{
ne++;
e[ne].last=note[u];
e[ne].end=v;
note[u]=ne;
}
void dfs(int x,int fx)
{
dfn[x]=++idx;//用dfs序给结点编号
size[x]=1;
for(int i=note[x];i;i=e[i].last)
if(e[i].end!=fx)
{
dfs(e[i].end,x);//继续dfs
//计算每个结点的子树大小,用于计算此结点的子树中最大的dfs序是多少,便于操作
size[x]+=size[e[i].end];
}
}
//线段树板子
void add_node(int p,int l,int r,int k)
{
tree[p]+=(r-l+1)*k;
lazy[p]+=k;
}
void clean_lazy(int p,int l,int r)
{
int mid=(l+r)>>1;
add_node((p<<1),l,mid,lazy[p]);
add_node((p<<1)+1,mid+1,r,lazy[p]);
lazy[p]=0;
}
void add(int p,int l,int r,int x,int y)
{
if(x>y) return;
if(l==x&&r==y)
{
add_node(p,l,r,1);
return;
}
clean_lazy(p,l,r);
int mid=(l+r)>>1;
if(y<=mid) add((p<<1),l,mid,x,y);
else if(x>mid) add((p<<1)+1,mid+1,r,x,y);
else add((p<<1),l,mid,x,mid),add((p<<1)+1,mid+1,r,mid+1,y);
}
int ask(int p,int l,int r,int x)
{
if(l==r) return tree[p];
clean_lazy(p,l,r);
int mid=(l+r)>>1;
if(x<=mid) return ask((p<<1),l,mid,x);
return ask((p<<1)+1,mid+1,r,x);
}
int main()
{
int n=0;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
int u=0,v=0;
scanf("%d%d",&u,&v);
make_edge(u,v);
make_edge(v,u);
}
dfs(1,0);
for(int i=1;i<=n;i++)
{
int x=0;
scanf("%d",&x);
printf("%d\n",ask(1,1,n,dfn[x]));//直接输出目的地所在的权值
add(1,1,n,dfn[x]+1,dfn[x]+size[x]-1);//给当前目的地所在结点的子树中所有结点的权值都加1
}
return 0;
}

Luogu P2982 [USACO10FEB]慢下来 Slowing down | dfs序、线段树的更多相关文章

  1. USACO10FEB]慢下来Slowing down dfs序 线段树

    [USACO10FEB]慢下来Slowing down 题面 洛谷P2982 本来想写树剖来着 暴力数据结构直接模拟,每头牛回到自己的农场后,其子树下的所有牛回到农舍时,必定会经过此牛舍,即:每头牛回 ...

  2. luogu 2982 [USACO10FEB]慢下来Slowing down dfs序+树状数组

    将要查询的信息放到 dfs 序上并用树状数组查一个前缀和即可. #include <bits/stdc++.h> #define N 100004 #define setIO(s) fre ...

  3. 洛谷P3178 [HAOI2015]树上操作(dfs序+线段树)

    P3178 [HAOI2015]树上操作 题目链接:https://www.luogu.org/problemnew/show/P3178 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边 ...

  4. Educational Codeforces Round 6 E dfs序+线段树

    题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili ...

  5. 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 339  Solved: 130[Submit][Status][Discuss] D ...

  6. Codeforces 343D Water Tree(DFS序 + 线段树)

    题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...

  7. BZOJ2434 [Noi2011]阿狸的打字机(AC自动机 + fail树 + DFS序 + 线段树)

    题目这么说的: 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的: 输入小 ...

  8. POJ 3321 DFS序+线段树

    单点修改树中某个节点,查询子树的性质.DFS序 子树序列一定在父节点的DFS序列之内,所以可以用线段树维护. 1: /* 2: DFS序 +线段树 3: */ 4:   5: #include < ...

  9. 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树

    题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...

随机推荐

  1. 教你用ps如何将图片、文字做出模糊斑驳的作旧效果

    1.对图片的图层执行滤镜-风格化-扩散,选变亮优先. 2.选择画笔工具,在画笔选项里选择喷溅59像素,画笔大小我用的是100px,大家可以根据自己的情况自定义大小,前景设置为黑色. 3.在图章图层上方 ...

  2. CS:APP Chapter-6 存储器层次系统-读书笔记

    存储器层次系统 笔记,应该不是一个大而全的文件,笔记应该是提纲挈领,是对思想的汇总浓缩,如果追求详实的内容反而是丢了初心. 计算机是抽象的,它的设计者努力让计算机变得简单,在设计上高度抽象,而计算机的 ...

  3. pip3 install beautifulsoup4 出现错误 There was a problem confirming the ssl certificate

    chenhuimingdeMacBook-Pro:groceryList Mch$ sudo pip3 install beautifulsoup4 The directory '/Users/Mch ...

  4. 大型项目源码集合「GitHub 热点速览 v.21.39」

    作者:HelloGitHub-小鱼干 代码,尤其是优雅规范的代码,一直都是学习编程技巧的捷径.虽然有实用的代码小片段,能拯救当前业务的燃眉之急,但是真要去提升自己的技能还是得从大型的项目,尤其是有一定 ...

  5. 牛客练习赛84F-牛客推荐系统开发之下班【莫比乌斯反演,杜教筛】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/11174/F 题目大意 给出\(n,k\)求 \[\sum_{i_1=1}^n\sum_{i_2=1}^n.. ...

  6. Kettle学习笔记(四)— 总结

    目录 Kettle学习笔记(一)- 环境部署及运行 Kettle学习笔记(二)- 基本操作 kettle学习笔记(三)- 定时任务的脚本执行 Kettle学习笔记(四)- 总结 Kettle中设置编码 ...

  7. 踩坑系列《六》Spring增加事务处理遇到异常解决办法

    当在对数据进行增删改操作时,需要用到事务的处理,所以在业务层中加入@Transactional注解,但是在执行业务操作的前面遇到异常,因此对异常进行抛出,但是数据又诡异地成功保存到数据库了. 解决方法 ...

  8. 使用vxe table组件时,edit-render配置$select',选中option后关闭cell的激活状态,显示选中option的value问题

    在我的项目中使用vxe table组件时,edit-render配置{name: '$select', options: [{label:"脉搏",value:"maib ...

  9. pdb的插拔测试

    pdb的插拔测试:将pdb从一个cdb中,插拔到另一个cdb中. 源端pdb unplug SQL> select instance_name from v$instance; INSTANCE ...

  10. [Linux]Ansible自动化运维② - 工具与模块

    目录 一.Ansible的工具 1.1 Ansible的工作前提 1.2 Ansible的安装文件 1.3 Ansible的配置文件 1.4 Ansible的相关工具 1.4.1 [帮助工具]Ansi ...