【洛谷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内工作,离他的梦想也越来越近了.这款 ...
随机推荐
- 【转】sizeof()用法总结
传送门:https://blog.csdn.net/u011677209/article/details/52837065
- 【Codeforces 682C】Alyona and the Tree
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 设dis[v]表示v以上的点到达这个点的最大权值(肯定是它的祖先中的某个点到这个点) 类似于最大连续累加和 当往下走(x,y)这条边的时候,设 ...
- [luoguP1072] Hankson 的趣味题(数论)
传送门 由题意得 gcd(x, a0) = a1 ——> gcd(x / a1, a0 / a1) = 1 lcm(x, b0) = b1 ——> x * b0 / gcd(x, b0) ...
- [bzoj2055]80人环游世界[网络流,上下界网络流]
手动画了整张图,,算是搞懂了吧,, #include <bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; templat ...
- NIO基础学习——缓冲区
NIO是对I/O处理的进一步抽象,包含了I/O的基础概念.我是基于网上博友的博客和Ron Hitchens写的<JAVA NIO>来学习的. NIO的三大核心内容:缓冲区,通道,选择器. ...
- Ubuntu 16.04解决在虚拟终端(Ctrl+Alt+F1)下显示菱形中文乱码问题
在安装Ubuntu时,如果默认选择了中文,那么以后进去到虚拟终端就会出现菱形的中文乱码. 其实这个是无解的,但是可以通过以下技巧去实现: 1.把系统转成英文的 sudo gedit /etc/defa ...
- LSN
http://www.cnblogs.com/lyhabc/archive/2013/07/16/3194220.html
- Angularjs中比较实用的DateFormat库
angular.module('newApp') .factory('dateUtil', function() { var symbolMap = { 'MM': function(date) { ...
- golang中select case 的用途到底是啥
https://nanxiao.gitbooks.io/golang-101-hacks/content/posts/select-operation.html ------------------- ...
- 为什么 Android Studio 工程文件夹占用空间这么大?
为什么 Android Studio 工程文件夹占用空间这么大? 学习了: https://www.cnblogs.com/chengyujia/p/5791002.html