time limit: 40 sec memory limit: 512 mb
submit: 1986 solved: 752
[submit][status][discuss]
小c同學認為跑步非常有趣,於是決定製作一款叫做《天天愛跑步》的遊戲。?天天愛跑步?是乙個養成類遊戲,需要
玩家每天按時上線,完成打卡任務。這個遊戲的地圖可以看作一一棵包含 n個結點和n-1 條邊的樹, 每條邊連線兩
個結點,且任意兩個結點存在一條路徑互相可達。樹上結點編號為從1到n的連續正整數。現在有個玩家,第個玩家的
起點為si ,終點為ti 。每天打卡任務開始時,所有玩家在第0秒同時從自己的起點出發, 以每秒跑一條邊的速度,
不間斷地沿著最短路徑向著自己的終點跑去, 跑到終點後該玩家就算完成了打卡任務。 (由於地圖是一棵樹, 所以
每個人的路徑是唯一的)小c想知道遊戲的活躍度, 所以在每個結點上都放置了乙個觀察員。 在結點的觀察員會選
擇在第wj秒觀察玩家, 乙個玩家能被這個觀察員觀察到當且僅當該玩家在第wj秒也理到達了結點j 。 小c想知道
每個觀察員會觀察到多少人?注意: 我們認為乙個玩家到達自己的終點後該玩家就會結束遊戲, 他不能等待一 段時
間後再被觀察員觀察到。 即對於把結點j作為終點的玩家: 若他在第wj秒重到達終點,則在結點j的觀察員不能觀察
到該玩家;若他正好在第wj秒到達終點,則在結點的觀察員可以觀察到這個玩家。
第一行有兩個整數n和m 。其中n代表樹的結點數量, 同時也是觀察員的數量, m代表玩家的數量。
接下來n-1 行每行兩個整數u和v ,表示結點u 到結點v 有一條邊。
接下來一行n 個整數,其中第個整數為wj , 表示結點出現觀察員的時間。
接下來 m行,每行兩個整數si和ti,表示乙個玩家的起點和終點。
對於所有的資料,保證 。
1<=si,ti<=n,0<=wj<=n
輸出1行n 個整數,第個整數表示結點的觀察員可以觀察到多少人。
6 32 3
1 21 4
4 54 6
0 2 5 1 2 3
1 51 3
2 62 0 0 1 1 1
對於1號點,w1=0,故只有起點為1號點的玩家才會被觀察到,所以玩家1和玩家2被觀察到,共2人被觀察到。
對於2號點,沒有玩家在第2秒時在此結點,共0人被觀察到。
對於3號點,沒有玩家在第5秒時在此結點,共0人被觀察到。
對於4號點,玩家1被觀察到,共1人被觀察到。
對於5號點,玩家1被觀察到,共1人被觀察到。
對於6號點,玩家3被觀察到,共1人被觀察到
樹上差分
把每乙個人的跑步路程分從\(lca\)上成兩段差分到樹根上
對於從下往上跑的人每次\(time++\),\(deep--\)
對於從上往下跑的人每次\(deep--\),\(time++\)
對於乙個\(u\)
能在\(t\)時間跑到他的只有他子樹內向上跑\(deep+time=deep_u+t\)的人和向下跑\(deep-time=deep_u-t\)的人
每次新到乙個點把現在的值減去,把這個點的貢獻加上,離開這個點時在把值加上
關於每個點的貢獻用vector存即可
#include#include#include#include#define m 3000001
using namespace std;
int i,m,n,j,k,a[m],ver[m],nex[m],head[m],x,y,cnt,z[m],s[m],d[m];
int wson[m],top[m],f[m],g[m],h[m],ans[m],ti[m];
vector qa[m],pa[m],qd[m],pd[m];
void add(int x,int y)
void dfs1(int x,int fa)
}void dfs2(int x,int fa)
}int lca(int x,int y)
return d[x]}void dfs(int now)
for(int i=0;ifor(int i=0;ians[now]+=g[d[now]+ti[now]+300000]+h[d[now]-ti[now]+300000];
}int main()
for(i=1;i<=n;i++) scanf("%d",&ti[i]);
dfs1(1,0); dfs2(1,1);
for(i=1;i<=m;i++)
dfs(1);
for(i=1;i<=n;i++) printf("%d ",ans[i]);
}
BZOJ4719 Noip2016 天天愛跑步
考慮鏈上做法,發現就是把每個路徑拆成一次加入和一次刪除,然後從前往後掃,走一步所有路徑經過當前點的時間就要麼加一,要麼減一,且要麼是一直加一,要麼是一直減一,可以用兩個陣列和指標來維護整體加減 用鏈剖把乙個區間轉換成o log n 個區間,即可在樹上做 include include include...
BZOJ4719 Noip2016 天天愛跑步
小c同學認為跑步非常有趣,於是決定製作一款叫做 天天愛跑步 的遊戲。天天愛跑步?是乙個養成類遊戲,需要 玩家每天按時上線,完成打卡任務。這個遊戲的地圖可以看作一一棵包含 n個結點和n 1 條邊的樹,每條邊連線兩 個結點,且任意兩個結點存在一條路徑互相可達。樹上結點編號為從1到n的連續正整數。現在有個...
NOIP2016 bzoj4719天天愛跑步
小c同學認為跑步非常有趣,於是決定製作一款叫做 天天愛跑步 的遊戲。天天愛跑步 是乙個養成類遊戲,需要玩家每天按時上線,完成打卡任務。這個遊戲的地圖可以看作一一棵包含 n n個結點和 n 1n 1條邊的樹,每條邊連線兩個結點,且任意兩個結點存在一條路徑互相可達。樹上結點編號為從11到n n的連續正整...