NOIP2016 天天愛跑步 樹上差分 dfs

2021-08-25 11:15:28 字數 1908 閱讀 8143

題目大意:給你一顆樹,樹上每個點都有乙個觀察員,他們僅會在 w[i] 時刻出現,觀察正在跑步的玩家

一共有m個玩家,他們分別從節點 s[i] 同時出發,以每秒跑一條邊的速度,沿著到 t[i] 的唯一路徑向節點t[i]奔跑

如果一名玩家已經到達了終點,那麼在他到達終點之後出現在終點的觀察員不會觀察到他

但如果在到達終點的同時觀察員也出現在終點,那麼觀察員可以觀察到他

求每個節點的觀察員觀察到玩家的數量

對於每個玩家的奔跑路線,可以拆成兩部分

<1>向上跑,從 u 向 lca 奔跑

顯然,玩家 u 能對觀察員 i 產生1點貢獻的充要條件為

顯然,向上走的路線能對 i 點產生共貢獻的條件是,起點 u 在 i 的子樹中

我們只需要統計符合條件的

<2>向下跑,從 lca 向 v 奔跑

那麼顯然

推導可得

顯然,向下走的路線能對i點產生共貢獻的條件是,終點 v 在 i 的子樹中

類似於上面的方法,我們只需要統計符合條件的

我們可以用vector在u,v,lca這三個點上打差分,存符合條件的值,注意值可能為負數

而其他子樹的結果會影響答案,所以深搜統計一次答案,再用回溯的答案減去深搜的答案即可

方法比較奇葩大家湊合看吧。。。

#include #include #include #include #define n 300010

#define maxn 300000

using namespace std;

int n,m,cte;

int dep[n],fa[n],tp[n],sz[n],son[n],ans[n];

int w[n],s[n],t[n],f[n],bac[n*3],head[n],tmp[n];

struct edgeedge[n*2];

vectors[n];

vectore[n];

int gc()

while(p>='0'&&p<='9')

return rett*fh;

}void edge_add(int u,int v)

void tsp1(int u,int dad)

sz[u]++;

}void tsp2(int u)

}int lca(int x,int y)

return dep[x]<=dep[y]?x:y;

}void dfs1(int u)

for(int i=0;i

bac[s[u][i]+maxn]++;

ans[u]+=bac[dep[u]+w[u]+maxn]-tmp[u];

for(int i=0;i

bac[e[u][i]+maxn]--;

}void dfs2(int u)

for(int i=0;i

bac[e[u][i]+maxn]--;

for(int i=0;i

bac[s[u][i]+maxn]++;

ans[u]+=bac[w[u]-dep[u]+maxn]-tmp[u];

}int main()

tp[1]=1;

tsp1(1,-1);

tsp2(1);

for(int i=1;i<=n;i++) w[i]=gc();

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

//debug();

dfs1(1);

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

memset(tmp,0,sizeof(tmp));

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

dfs2(1);

for(int i=1;i<=n;i++) printf("%d ",ans[i]);

return 0;

}

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 天天愛跑步 不帶修改的樹上路徑資訊的維護,很容易想到樹上差分。我們考慮一條路...