NOIP2016 bzoj4719天天愛跑步

2021-08-10 13:20:49 字數 1964 閱讀 4422

小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到...