【洛谷2982】[Usaco2010 Feb]慢下来Slowdown(dfs序+线段树)
题目:
洛谷2982
分析:
这道题最重要的是想明白一点:牛\(i\)走到以后只对\(P_i\)的子树产生影响
知道这个以后,就可以想到在线维护每个牧场已经被“影响”了多少次(也就是在此之前有多少个牛是到达自己的祖先结点的),这就是从谷仓到这个牧场需要减速多少次。
怎么维护子树信息呢?dfs序+线段树啊……
于是变成模板题
代码:
(虽然题目只要求支持单点查询,但是线段树模板打顺手了就不知不觉地写了区间查询……)
\(in[i]\)代表\(i\)的编号
\(out[i]\)代表\(i\)子树中最后一个结点的编号
则\(in[i]\)~\(out[i]\)就是结点\(i\)和它的子树
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
vector<int>g[100010];
int in[100010],out[100010],p[100010],n,cnt,ans;
struct node
{
int val;
int lazy;
}tree[400010];
void dfs(int u,int fa)
{
in[u]=++cnt;
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(v==fa)continue;
dfs(v,u);
}
out[u]=cnt;
}
void pushdown(int root,int lt,int rt)
{
if(tree[root].lazy==0)return;
int mid=(lt+rt)/2;
node &ln=tree[root*2+1],&rn=tree[root*2+2];
ln.val+=tree[root].lazy*(mid-lt+1);
ln.lazy+=tree[root].lazy;
rn.val+=tree[root].lazy*(rt-mid);
rn.lazy+=tree[root].lazy;
tree[root].lazy=0;
}
void add(int root,int lt,int rt,int ls,int rs,int x)
{
if(lt>rt||lt>rs||rt<ls)return;
if(lt>=ls&&rt<=rs)
tree[root].val+=x*(rt-lt+1),
tree[root].lazy+=x;
else
{
int mid=(lt+rt)/2;
pushdown(root,lt,rt);
add(root*2+1,lt,mid,ls,rs,x);
add(root*2+2,mid+1,rt,ls,rs,x);
tree[root].val=tree[root*2+1].val+tree[root*2+2].val;
}
}
int ask(int root,int lt,int rt,int ls,int rs)
{
if(lt>rt||lt>rs||rt<ls)return 0;
if(lt>=ls&rt<=rs)
return tree[root].val;
else
{
int mid=(lt+rt)/2;
pushdown(root,lt,rt);
return ask(root*2+1,lt,mid,ls,rs)+ask(root*2+2,mid+1,rt,ls,rs);
}
}
int main(void)
{
scanf("%d",&n);
for(int i=1;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
g[a].push_back(b);
g[b].push_back(a);
}
for(int i=1;i<=n;i++)
scanf("%d",p+i);
dfs(1,0);
for(int i=1;i<=n;i++)
{
printf("%d\n",ask(0,1,n,in[p[i]],in[p[i]]));
add(0,1,n,in[p[i]],out[p[i]],1);
}
return 0;
}
【洛谷2982】[Usaco2010 Feb]慢下来Slowdown(dfs序+线段树)的更多相关文章
- BZOJ 1782 洛谷 2982 [Usaco2010 Feb]slowdown 慢慢游
[题解] 一头牛走到i,相当于把i点的子树的点权都加1,查询减慢的次数就是查询目的地的点权. 预处理dfs序,某个点的子树的dfs序是连续的一段.差分后用树状数组维护,变成点修区查.或者直接线段树区修 ...
- bzoj 1782: [Usaco2010 Feb]slowdown 慢慢游【dfs序+线段树】
考虑每头牛到达之后的影响,u到达之后,从1到其子树内的点需要放慢的都多了一个,p为u子树内点的牛ans会加1 用线段树维护dfs序,每次修改子树区间,答案直接单点查询p即可 #include<i ...
- 洛谷P4770 [NOI2018]你的名字 [后缀自动机,线段树合并]
传送门 思路 按照套路,直接上后缀自动机. 部分分:\(l=1,r=|S|\) 首先把\(S\)和\(T\)的后缀自动机都建出来. 考虑枚举\(T\)中的右端点\(r\),查询以\(r\)结尾的串最长 ...
- 洛谷P4254 [JSOI2008]Blue Mary开公司(李超线段树)
题面 传送门 题解 李超线段树板子 具体可以看这里 //minamoto #include<bits/stdc++.h> #define R register #define fp(i,a ...
- 洛谷P3178 [HAOI2015]树上操作(dfs序+线段树)
P3178 [HAOI2015]树上操作 题目链接:https://www.luogu.org/problemnew/show/P3178 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边 ...
- 洛谷P4493 [HAOI2018]字串覆盖(后缀自动机+线段树+倍增)
题面 传送门 题解 字符串就硬是要和数据结构结合在一起么--\(loj\)上\(rk1\)好像码了\(10k\)的样子-- 我们设\(L=r-l+1\) 首先可以发现对于\(T\)串一定是从左到右,能 ...
- 【洛谷 P2464】[SDOI2008]郁闷的小J(线段树)
题目链接 这题我很久之前用分块写过,没写出来.. 今天又看到了,于是下决心把这题做出来. 这次我用线段树写的,直接对每本书的编号Hash一下然后离散化然后各建一棵线段树,维护当前编号在某个位置有没有书 ...
- 洛谷P4770 [NOI2018]你的名字(后缀自动机+线段树)
传送门 我有种自己根本没学过SAM的感觉……最后还是抄了老半天的题解…… 首先,对$S$和每一次的$T$都建一个SAM 先考虑一下$l=1,r=\left| S \right|$的情况 设$lim_i ...
- 洛谷P4364 [九省联考2018]IIIDX 【线段树】
题目 [题目背景] Osu听过没?那是Konano最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在 ,他在世界知名游戏公司KONMAI内工作,离他的梦想也越来越近了.这款 ...
随机推荐
- Linux 复习四
第四章 shell程序设计I-入门 一.shell脚本的基本概念 shell脚本(script)是一个可执行的纯文本文件,有多个shell命令组成. 命令的执行时从上而下.从左而右的分析和执行 命令. ...
- Billboard (HDU 2795)
Billboard (HDU 2795) Hdu 2795 注意到每个广告的长度是1,因此可以将每这一张广告牌当成一个数列表示,每个初始值为w.使用线段树维护这个数列,每次查询为找到这个数列第一个大于 ...
- Ajax_数据格式_JSON
[JSON] 1.JSON(JavaScript Object Notation)一种简单的数据格式,比xml更轻巧.JSON是JavaScript原生格式,这意味着在JavaScript中处理JSO ...
- cogs——1578. 次小生成树初级练习题
1578. 次小生成树初级练习题 ☆ 输入文件:mst2.in 输出文件:mst2.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 求严格次小生成树 [输入格式 ...
- HDU——3579 Hello Kiki
Hello Kiki Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 从理论到实践,全方位认识DNS(实践篇)
在理论篇中,我们基本了解了DNS的整个协议原理,但是可能还会有着下面的疑问: 为什么我想申请的域名都没了? DNS 域名还要备案,这是为什么啊? 如何将刚申请的域名绑定到自己的网站呢? 怎么才能看到那 ...
- [C++]_[获取Utf8字符串的字符个数和子字符串]
场景: 1.有时候须要统计utf8字符串的个数,单纯统计字节个数是不行的. 2.有时候也须要获取从某个位置開始的n个连续字符用于显示或计算. static int GetUtf8LetterNumbe ...
- ECMAScript 对象类型
ECMAScript:本地对象.内置对象.宿主对象 一.本地对象: 定义:ECMA-262(ECMAScript语言规范) 定义其为“独立于宿主环境的 ECMAScript 实现提供的对象”.它是由 ...
- 操作系统的时区设置会影响数据库查询SYSDATE和SYSTIMESTAMP的值
SYSDATE和SYSTIMESTAMP的值并不受数据库參数DBTIMEZONE的影响,操作系统时区的环境变量(如TZ)会影响它们的输入,由于SYSDATE和SYSTIMESTAMP实际是调用操作系统 ...
- 继承自TWinControl的控件不能在设计期间接受子控件,用代码设置子控件却可以(它的自绘是直接改写PaintWindow虚函数,而不是覆盖Paint函数——对TWinControl.WMPaint又有新解了)
这个控件直接继承自TWinControl,因此不是改写Paint;函数,而是直接改写PaintWindow虚函数,它在VCL框架里被直接调用,直接就把自己画好了(不用走给控件Perform(WM_Pa ...