【洛谷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内工作,离他的梦想也越来越近了.这款 ...
随机推荐
- 洛谷 4768 LOJ 2718「NOI2018」归程
[题解] 本题有多种做法,例如可持久化并查集.kruskal重构树等. kruskal重构树的做法是这样的:先把边按照海拔h从大到小的顺序排序,然后跑kruskal建立海拔的最大生成树,顺便建krus ...
- HDU - 6446 Tree and Permutation
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6446 本题是一个树上的问题——DFS. 一棵N个结点的树,其结点为1~N.树具有N-1条边,每一条边具有 ...
- 使用lombok提高编码效率-----不用写get set
使用lombok提高编码效率-----不用写get set https://blog.csdn.net/v2sking/article/details/73431364
- mongo实践-透过js shell操作mongo
mongo实践-通过js shell操作mongo 保存命令: j={name:"wangjingjing",age:15} db.user.save(j); 查询命令: var ...
- 最大公约数GCD
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 输入2个正整数A,B,求A与B的最大公约数. Input 2个数A,B,中间用空格隔开.(1<= A,B <= ...
- 理解 LARGE_INTEGER的定义
http://bbs.csdn.net/topics/310239341 #if defined(MIDL_PASS) typedef struct _LARGE_INTEGER { #else // ...
- 学一学书里的django是怎么写views.py的
他山之石,可以攻玉嘛. 好的习惯有时也是学别人来养成的. 外国人的编码习惯,学啊. from django.core.urlresolvers import reverse_lazy from dja ...
- alpha版出炉,实现win2008 service的session 0穿透
指定用户名,拿最小session,实现和用户ui交互. 这样,搞windows的自动化部署,就可以向前一大步啦. 比以前用psexec要用户名密码,指定session要先进多啦. 安全保密性也提高了. ...
- MS SQL SERVER 书BOOK
http://www.cnblogs.com/lyhabc/p/4833248.html
- some notes about ADDM and AWR
Use the sophisticated management and monitoring features of the Oracle DatabaseDiagnostic and Tuning ...