bzoj3697 採藥人的路徑

2021-07-31 07:01:49 字數 2030 閱讀 5673

這是個思路題,對我這樣的zz

來說可能已經接近自己想出來的極限了。

一看統計符合條件的路徑條數,肯定是點分治,而且肯定是靜態的。

首先把邊權變成

1 和−1

,那麼一條路徑陰陽平衡也就是說它的權值和等於

0 。

根據點分治的過程,可知重心和路徑是一對多的關係,而且一條路徑只會對應乙個重心,就是說每條路徑都只會在搞某乙個重心時被統計,而且僅會被統計一次。

考慮某條路徑被統計的時候的情形。

它肯定會被分成兩段,假設這兩段是x和

y ,因為權值和為

0,所以這兩段的權值和一定是相反數。

題目要求必須找到乙個斷點,使得斷開後兩段的權值和都為

0 。

考慮斷點的位置,要麼在

x段上,要麼在

y 段上,要麼就是重心。

為了不重複統計,我們先統計在

x端上或在

y 段上的,最後統計在重心上的,所以我們必須強制規定重心不在這兩段的任何一段上。

用乙個goo

d陣列記錄某條路徑能否在其末端找出一段和等於

0 ,這個可以開個權值桶然後df

s過程中算出。用f[

0/1]

[i] 表示go

od是否具有go

od屬性,權值和為

i 的路徑的條數,那麼在一棵子樹一棵子樹合併的時候,如果當前點no

w具有go

od屬性,就把f[

0][−

dist

[now

]]+f

[1][

−dst

[now

]]計入答案;如果當前點不具有go

od屬性,就把f[

1][−

dist

[now

]]計入答案。

以上只是算了斷點不在重心的。

最後再加上斷點在重心的,這個可以加入一棵子樹的時候搞,如果當前點不具有go

od屬性,就把f[

0][0

] 計入答案。

打完之後交上去發現wr

onga

nswe

r 了,寫了個對拍,發現還存在乙個端點在重心,另乙個端點在子樹中的情況沒計入。這個好說只要做完乙個重心之後把f[

1][0

] 計入答案就好了。

//點分治

#include

#include

#define maxn 200010

#define ll long long

#define forp for(ll p=head[pos];p;p=nex[p])if(to[p]^pre and !grey[to[p]])

using namespace std;

ll dist[maxn], deep[maxn], n, size[maxn], g, head[maxn], to[maxn], w[maxn],

nex[maxn], tot, list[maxn], cnt[maxn], f[2][maxn];

bool grey[maxn], good[maxn];

ll ans, sumg;

inline void adde(ll a, ll b, ll v)

inline ll read(ll x=0)

ll dfs(ll pos, ll pre)

void findg(ll pos, ll pre, ll sum)

void solve(ll pos)

for(i=1;i<=*list;i++)f[good[list[i]]][dist[list[i]]+n]++;

}ans+=f[1][n];

for(p=head[g];p;p=nex[p])

if(!grey[to[p]])

for(p=head[g];p;p=nex[p])if(!grey[to[p]])solve(to[p]);

}void init()

int main()

BZOJ3697 採藥人的路徑

給定一棵樹,找一些路徑滿足,路徑上0,1數量相等,並在路徑上找到乙個點 休息站 改點到路徑兩端上0,1數量也相等,同一條路徑點不同,記為不同,詢問有多少條路徑滿足條件 點分治 對於乙個點 u 我們遍歷每棵子樹中的節點 v,求出di s u,v 我們記錄這條路徑上有無節點 t 使得di s v,t 0...

bzoj3697 採藥人的路徑

description 採藥人的藥田是乙個樹狀結構,每條路徑上都種植著同種藥材。採藥人以自己對藥材獨到的見解,對每種藥材進行了分類。大致分為兩類,一種是陰性的,一種是陽性的。採藥人每天都要進行採藥活動。他選擇的路徑是很有講究的,他認為陰陽平衡是很重要的,所以他走的一定是兩種藥材數目相等的路徑。採藥工...

bzoj3697 採藥人的路徑 點分治

一道拖了很久的點分治,現在把他搞定了。來自出題人hta的題解 本題可以考慮樹的點分治。問題就變成求過根滿足條件的路徑數。路徑上的休息站一定是在起點到根的路徑上,或者根到終點的路徑上。如何判斷一條從根出發的路徑是否包含休息站?只要在dfs中記錄下這條路徑的和x,同時用個標誌陣列判斷這條路徑是否存在字首...