对于一条路径,s-t,位于该路径上的观察员能观察到运动员当且仅当以下两种情况成立:(d[ ]表示节点深度) 1.观察员x在s-lca(s,t)上时,满足d[s]=d[x]+w[x]就能观察到,所以我们在这条路径上每个点都放置一个d[s]的物品(差分实现),所有路径处理完后dfs一遍,查询每个节点d[x]+w[x]的物品有多少个就是该种情况的答案. 2.观察员x在lca(s,t)-t上时,同理有d[s]+d[t]-2*d[z]-w[x]=d[t]-d[x],移项的d[s]-2*d[z]=w[x]-…
题目大意: 有一棵n个点的树,每个点上有一个摄像头会在第w[i]秒拍照. 有m个人再树上跑,第i个人沿着s[i]到t[i]的路径跑,每秒钟跑一条边. 跑到t[i]的下一秒,人就会消失. 问每个摄像头会拍下几个人. 思路: 首先很显然是要求LCA的. 求完LCA怎么办? 我们可以用树上差分的方法分别维护向上.向下的链. 每一条路径,我们可以在s,t,lca,par[lca]上分别打标记. s +dep[s] t +dep[t]-len lca -dep[s] par[lca] +len-dep[t…
原文链接 原题链接 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 \(n\)个结点和 \(n-1\)条边的树, 每条边连接两个结点,且任意两个结点存在一条路径互相可达.树上结点编号为从\(1\)到\(n\)的连续正整数. 现在有\(m\)个玩家,第\(i\)个玩家的起点为 \(S_i\),终点为 \(T_i\) .每天打卡任务开始时,所有玩家在第\…
号称是noip2016最恶心的题 基本上用了一天来搞明白+给sy讲明白(可能还没讲明白 具体思路是真的不想写了(快吐了 如果要看,参见洛谷P1600 天天爱跑步--题解 虽然这样不好但我真的不想写了 直接放代码: #include<bits/stdc++.h> #include<vector> using namespace std; inline int read() { int ans=0; char last=' ',ch=getchar(); while(ch>'9'…
题目:https://www.luogu.org/problemnew/show/P1600 看TJ:https://blog.csdn.net/clove_unique/article/details/53427248 树上差分真好. 首先要发现向上和向下的……是定值.然后想到可以差分. 本题的差分略特殊之处在于它的对象是一条连到根的链.把链上的差分值记到非根的端点上. 总之看明白TJ之后感觉真精妙. 而且 从各种中选自己需要的 只需把所有都加进桶中! #include<iostream>…
题目:https://www.luogu.org/problemnew/show/P1600 看博客:https://blog.csdn.net/clove_unique/article/details/53427248 思路好神啊... 树上差分是好东西. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std;…
正解:树上差分 解题报告: 传送门$QwQ$! 这题还挺妙的,,,我想了半天才会$kk$ 首先对一条链$S-T$,考虑先将它拆成$S-LCA$和$LCA-T$,分别做.因为总体上来说差不多接下来我就只港$S-LCA$的做法了$QwQ$ 考虑对于一个观察点$j$,若要观察到玩家$i$,则有$dep_j+w_j=dep_i$.发现现在就只用统计$j$的子树内所有起点深度等于$dep_j+w_j$的就行. 显然考虑树上差分呗.就开个桶记$dep_i$,对每条路径在$S$处给$dep_S$+1,到$LC…
题目大意:给你一颗树,树上每个点都有一个观察员,他们仅会在 w[i] 时刻出现,观察正在跑步的玩家 一共有m个玩家,他们分别从节点 s[i] 同时出发,以每秒跑一条边的速度,沿着到 t[i] 的唯一路径向节点t[i]奔跑 如果一名玩家已经到达了终点,那么在他到达终点之后出现在终点的观察员不会观察到他 但如果在到达终点的同时观察员也出现在终点,那么观察员可以观察到他 求每个节点的观察员观察到玩家的数量 对于每个玩家的奔跑路线,可以拆成两部分 <1>向上跑,从 u 向 lca 奔跑 显然,玩家 u…
将每个人跑步的路径拆分成x->lca,lca->y两条路径分别考虑: 对于在点i的观察点,这个人(s->t)能被观察到的充要条件为: 1.直向上的路径:w[i]=dep[s]-dep[i],移项得w[i]+dep[i]=dep[s] 2.直向下的路径:w[i]=dep[s]-dep[lca]+dep[i]-dep[lca],移项得w[i]-dep[i]=dep[s]-2*dep[lca]. 问题转化为,对每个点i,统计它的子树中有多少个点x满足dep[x]=w[i]+dep[i]或dep…
传送门 题目分析: 一年前还是个傻子的时候居然直接放弃了这题. 首先列出两个方程:如果i节点的观察员能够观察到由s->t的那个人,那么: \[dep[s] - dep[i] = w[i], dep[t] - dep[i] = len - w[i]\] 整理得到:\[dep[s] = w[i] + dep[i] (1), dep[t] - len = dep[i] - w[i] (2)\] 也就是说:只要起点满足方程(1)和终点满足方程(2)的都能被i看到,下面考虑下差分:因为树的dfs是连续的,…