NOIP2016 天天愛跑步

2022-06-09 04:03:06 字數 3776 閱讀 7448

小c同學認為跑步非常有趣,於是決定製作一款叫做《天天愛跑步》的遊戲。《天天愛跑步》是乙個養成類遊戲,需要玩家每天按時上線,完成打卡任務。

這個遊戲的地圖可以看作一一棵包含 nnn 個結點和 n−1n-1n−1 條邊的樹, 每條邊連線兩個結點,且任意兩個結點存在一條路徑互相可達。樹上結點編號為從111 到nnn 的連續正整數。

現在有mmm 個玩家,第iii 個玩家的起點為 sis_isi​,終點為 tit_iti​。每天打卡任務開始時,所有玩家在第000 秒同時從自己的起點出發, 以每秒跑一條邊的速度, 不間斷地沿著最短路徑向著自己的終點跑去, 跑到終點後該玩家就算完成了打卡任務。 (由於地圖是一棵樹, 所以每個人的路徑是唯一的)

小c想知道遊戲的活躍度, 所以在每個結點上都放置了乙個觀察員。 在結點jjj 的觀察員會選擇在第wjw_jwj​秒觀察玩家, 乙個玩家能被這個觀察員觀察到當且僅當該玩家在第wjw_jwj​秒也理到達了結點 jjj 。 小c想知道每個觀察員會觀察到多少人?

注意: 我們認為乙個玩家到達自己的終點後該玩家就會結束遊戲, 他不能等待一 段時間後再被觀察員觀察到。 即對於把結點jjj 作為終點的玩家: 若他在第wjw_jwj​秒前到達終點,則在結點jjj 的觀察員不能觀察到該玩家;若他正好在第wjw_jwj​秒到達終點,則在結點jjj 的觀察員可以觀察到這個玩家。

輸入格式:

第一行有兩個整數nnn 和mmm 。其中nnn 代表樹的結點數量, 同時也是觀察員的數量, mmm 代表玩家的數量。

接下來 n−1n- 1n−1 行每行兩個整數uuu 和 vvv ,表示結點 uuu 到結點 vvv 有一條邊。

接下來一行 nnn 個整數,其中第jjj 個整數為wjw_jwj​, 表示結點jjj 出現觀察員的時間。

接下來 mmm 行,每行兩個整數sis_isi​,和tit_iti​,表示乙個玩家的起點和終點。

對於所有的資料,保證1≤si,ti≤n,0≤wj≤n1\leq s_i,t_i\leq n, 0\leq w_j\leq n1≤si​,ti​≤n,0≤wj​≤n 。

輸出格式:

輸出1行 nnn 個整數,第jjj 個整數表示結點jjj 的觀察員可以觀察到多少人。

輸入樣例#1:複製

6 3

2 31 2

1 4

4 5

4 6

0 2 5 1 2 3

1 5

1 3

2 6

輸出樣例#1:複製

2 0 0 1 1 1
輸入樣例#2:複製

5 3 

1 2

2 3

2 4

1 5

0 1 0 3 0

3 1

1 45 5

輸出樣例#2:複製

1 2 1 0 1
【樣例1說明】

對於1號點,wi=0w_i=0wi​=0 ,故只有起點為1號點的玩家才會被觀察到,所以玩家1和玩家2被觀察到,共有2人被觀察到。

對於2號點,沒有玩家在第2秒時在此結點,共0人被觀察到。

對於3號點,沒有玩家在第5秒時在此結點,共0人被觀察到。

對於4號點,玩家1被觀察到,共1人被觀察到。

對於5號點,玩家1被觀察到,共1人被觀察到。

對於6號點,玩家3被觀察到,共1人被觀察到。

【子任務】

【提示】

如果你的程式需要用到較大的棧空問 (這通常意味著需要較深層數的遞迴), 請務必仔細閱讀選手日錄下的文字當rumung:/stact.p″, 以了解在最終評測時棧空問的限制與在當前工作環境下調整棧空問限制的方法。

在最終評測時,呼叫棧占用的空間大小不會有單獨的限制,但在我們的工作

環境中缺省會有 8 mb 的限制。 這可能會引起函式呼叫層數較多時, 程式發生

棧溢位崩潰。

我們可以使用一些方法修改呼叫棧的大小限制。 例如, 在終端中輸入下列命

令 ulimit -s 1048576

此命令的意義是,將呼叫棧的大小限制修改為 1 gb。

例如,在選手目錄建立如下 sample.cpp 或 sample.pas

將上述源**編譯為可執行檔案 sample 後,可以在終端中執行如下命令運

行該程式

./sample

如果在沒有使用命令「 ulimit -s 1048576」的情況下執行該程式, sample

會因為棧溢位而崩潰; 如果使用了上述命令後執行該程式,該程式則不會崩潰。

特別地, 當你開啟多個終端時, 它們並不會共享該命令, 你需要分別對它們

執行該命令。

請注意, 呼叫棧占用的空間會計入總空間占用中, 和程式其他部分占用的內

存共同受到記憶體限制。

25分暴力模擬做法

1

//2023年2月16日21:22:53

2 #include 3 #include 4

using

namespace

std;56

const

int n = 300001;7

const

int m = 300001;8

9int

n, m;

1011

struct

edgee[m];

1415

intfir[n], edge_num, w[n], s[n], t[n], sig[n];

16void addedge(int x, int

y)21

22int

lca[n];

23int

fa[n], top[n], deep[n], siz[n], son[n], val[n];

2425

void dfs1(int

x)36}37

}3839void dfs2(int

x)46

int query(int x, int

y)50

inttim;

51void dfsup(int x, int

ii)else61}

6263

void dfsdown(int x, int

ii)69

if(x ==t[ii])else78}

7980

intmain()

88for(int i=1;i<=n;i++)

89 scanf("

%d", &w[i]);

90 dfs1(1

);91 dfs2(1

);92

for(int i=1;i<=m;i++)else

if(s[i] ==t[i])else

105}

106//

....

107for(int i=1;i<=n;i++)

108 printf("

%d "

, sig[i]);

109110

return0;

111 }

未完待續, 等著將來填坑

NOIP2016 天天愛跑步

時間限制 2 s 記憶體限制 512 mb 題目描述 小c同學認為跑步非常有趣,於是決定製作一款叫做 天天愛跑步 的遊戲。天天愛跑步 是乙個養成類遊戲,需要玩家每天按時上線,完成打卡任務。這個遊戲的地圖可以看作一棵包含n個結點和n 1條邊的樹,每條邊連線兩個結點,且任意兩個結點存在一條路徑互相可達。...

NOIP2016天天愛跑步

小c同學認為跑步非常有趣,於是決定製作一款叫做 天天愛跑步 的遊戲。天天愛跑步 是乙個養成類遊戲,需要玩家每天按時上線,完成打卡任務。這個遊戲的地圖可以看作一一棵包含 nn n個結點和 n 1n 1n 1條邊的樹,每條邊連線兩個結點,且任意兩個結點存在一條路徑互相可達。樹上結點編號為從11 1到nn...

NOIP2016 天天愛跑步

看這道題不爽很久了,但一直沒有開它,原因是我不會 我太菜了 看了題解還是寫不來,因為我不會線段樹合併。然後今天學了dsu on tree這種神奇的科技,成功把它a了,效率吊打線段樹合併。於是寫篇題解紀念一下。洛谷p1600 天天愛跑步 不帶修改的樹上路徑資訊的維護,很容易想到樹上差分。我們考慮一條路...