小c同學認為跑步非常有趣,於是決定製作一款叫做《天天愛跑步》的遊戲。«天天愛跑步»是乙個養成類遊戲,需要玩家每天按時上線,完成打卡任務。
這個遊戲的地圖可以看作一一棵包含 n
n個結點和 n-1n−
1條邊的樹, 每條邊連線兩個結點,且任意兩個結點存在一條路徑互相可達。樹上結點編號為從11到n
n的連續正整數。
現在有m
m個玩家,第i
i個玩家的起點為 s_isi
,終點為 t_iti
。每天打卡任務開始時,所有玩家在第0
0秒同時從自己的起點出發, 以每秒跑一條邊的速度, 不間斷地沿著最短路徑向著自己的終點跑去, 跑到終點後該玩家就算完成了打卡任務。 (由於地圖是一棵樹, 所以每個人的路徑是唯一的)
小c想知道遊戲的活躍度, 所以在每個結點上都放置了乙個觀察員。 在結點j
j的觀察員會選擇在第w_jwj
秒觀察玩家, 乙個玩家能被這個觀察員觀察到當且僅當該玩家在第w_jwj
秒也理到達了結點 j
j 。 小c想知道每個觀察員會觀察到多少人?
注意: 我們認為乙個玩家到達自己的終點後該玩家就會結束遊戲, 他不能等待一 段時間後再被觀察員觀察到。 即對於把結點j
j作為終點的玩家: 若他在第w_jwj
秒前到達終點,則在結點j
j的觀察員不能觀察到該玩家;若他正好在第w_jwj
秒到達終點,則在結點j
j的觀察員可以觀察到這個玩家。
終於有一天,把天天愛跑步ac了,學了一年oi一
直活在天天愛跑步的陰影之下,然後教練講了好多遍還是沒聽懂=_=,也不會實現方法,不過仔細想了一下思路還是很清晰的。
首先我們把路徑拆分成兩條分別從起點到lca與lca到終點的路徑,對於路徑的特性進行觀察,即可發現,向上的路徑深度與時間的和為定值(向上深度-1,時間+1),向下深度與路徑的差為定值(向下深度+1,時間+1)。
接著思考一下就能發現,從下到上的時候只在自己的路徑上會影響到答案,那麼我們便可使用差分的方法,在起點的時候給差分陣列+1,給lca的差分陣列-1,那麼我們從下向上維護路徑上的差分陣列,到達每個點的時候查詢這個點深度+時間的定值的那個陣列的值,即為從下向上時的答案。由於從lca到終點也可以看作從終點到lca從下到上,思路同理可得。
接下來就是細節的問題了。
1.在向上與向下時,如果lca更新了答案,那麼會被計算兩次,所以最後判斷一下,如果這條路徑可以剛好lca的答案,那麼給lca的答案減一即可。
2.是我想了好久的差分差在哪的問題,一般來說我們會差在lca的父親上,但是如果這樣的話,在更新答案的時候我們會造成一些不必要的麻煩,所以我選擇直接查分在lca上,在乙個節點先把要加的加到計數陣列裡,更新答案,再減去這個節點要減的答案。
下附ac**。
#include#include#include#include#define maxn 300005
using namespace std;
int n,q;
int dep[maxn];
int tim[maxn];
int anc[maxn][26];
vectoredge[maxn];
void dfs(int now,int fa)
int len=edge[now].size();
for(int i=0;i=0;i--)
return anc[p][0];
}int u[maxn],e[maxn];
struct nod
nod(){}
};int ans[maxn];
int cnt1[maxn*2],cnt2[maxn*2];
vectorshang[maxn],xia[maxn];
void dfs1(int now,int fa)
{ ans[now]-=cnt1[tim[now]+dep[now]];
int len=edge[now].size();
for(int i=0;i
BZOJ4719 Noip2016 天天愛跑步
考慮鏈上做法,發現就是把每個路徑拆成一次加入和一次刪除,然後從前往後掃,走一步所有路徑經過當前點的時間就要麼加一,要麼減一,且要麼是一直加一,要麼是一直減一,可以用兩個陣列和指標來維護整體加減 用鏈剖把乙個區間轉換成o log n 個區間,即可在樹上做 include include include...
BZOJ4719 Noip2016 天天愛跑步
小c同學認為跑步非常有趣,於是決定製作一款叫做 天天愛跑步 的遊戲。天天愛跑步?是乙個養成類遊戲,需要 玩家每天按時上線,完成打卡任務。這個遊戲的地圖可以看作一一棵包含 n個結點和n 1 條邊的樹,每條邊連線兩 個結點,且任意兩個結點存在一條路徑互相可達。樹上結點編號為從1到n的連續正整數。現在有個...
bzoj4719 Noip2016 天天愛跑步
description 小c同學認為跑步非常有趣,於是決定製作一款叫做 天天愛跑步 的遊戲。天天愛跑步?是乙個養成類遊戲,需要 玩家每天按時上線,完成打卡任務。這個遊戲的地圖可以看作一一棵包含 n個結點和n 1 條邊的樹,每條邊連線兩 個結點,且任意兩個結點存在一條路徑互相可達。樹上結點編號為從1到...