bzoj3697 FJ2014集訓 採藥人的路徑

2022-05-19 23:58:28 字數 2787 閱讀 5281

小道士的矯情之路;

點分治,

對於每個子樹,處理其內經過根(重心)的路徑,然後遞迴下一層子樹;

如何處理經過根的合法路徑

合法有兩個要求;

把輸入的0改成-1後

1.len=0;

2.存在乙個點i使被她分開的兩個路徑len均為零;

在每次統計中我們可以dfs統計每條從根開始的路徑(half_way),

任意兩條這樣的路徑拼成一條可能合法的路徑;

check合法?

通過dfs;

統計1,每個half_way的len

還要統計,2,這個half_way上是否有乙個點到half_way的終點(根之外的那個)的len=0;

一,兩個half_way的len加為0才可能合法;

二,兩個half_way中至少乙個滿足「有乙個點到half_way的終點(根之外的那個)的len=0」;

只要滿足一&&二,則路徑合法;(自己思考why?)

1很好統計;

關鍵是2;

可以考慮維護乙個桶;

如果root到i的路徑len=x,且桶x已經有值了,則i的二合法;(自己思考why?)

由於這裡細節極多,不好全部言明,故直接看**:

1

long

long get_ans(int root,int

w)17 ans+=(long

long)(k+l)*(k+l-1)/2

;18 ans+=(long

long)k*(ll-kk+1-l-k);

19break;20

}21while(1)25

while(1

)29 ans+=(long

long)k*(ll-j-l)+l*(i-kk-k)+k*l;i--;30}

31}32if(w)map[zero]=0;33

return

ans;34}

35void dfs_ans(int now,int sum,int

fa)

view code

由於這個操作是單次o(logn)的,於是我的做法比標解多了乙個不大log;

(標解o(nlogn),本人o(nlog²n),......大約是這樣)

之前桶沒清乾淨,拍了好久沒發現;

總**:

1 #include2 #include3

using

namespace

std;

4const

int zero=100004;5

intn,tot;

6long

long

ans;

7struct

half_wayhw[200010

];10

int map[200010],vis[100010],size[100010],lsize[100010

];11

struct

sse[200010

];14

int first[100010

],num;

15bool

cmp(half_way a,half_way b)

18void build(int ,int ,int

);19

void part_dfs(int

);20

void dfs_size(int ,int

);21

int dfs_root(int ,int ,int

);22

long

long get_ans(int ,int

);23

void dfs_ans(int ,int ,int

);24

intmain()

2534 part_dfs(1

);35 printf("

%lld

",ans);

36return0;

37}38void build(int f,int t,int

wi)43

void part_dfs(int

now)54}

55void dfs_size(int now,int

fa)62}63

int dfs_root(int now,int fa,int

r)74

if(lsize[now]1

)75 root=now;

76return

root;77}

78long

long get_ans(int root,int

w)94 ans+=(long

long)(k+l)*(k+l-1)/2

;95 ans+=(long

long)k*(ll-kk+1-l-k);

96break;97

}98while(1

)102

while(1

)106 ans+=(long

long)k*(ll-j-l)+l*(i-kk-k)+k*l;i--;

107}

108}

109if(w)map[zero]=0

;110

return

ans;

111}

112void dfs_ans(int now,int sum,int

fa)

從時間複雜度和**量上都不如標解,唉,也難怪;

BZOJ3697 採藥人的路徑

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

bzoj3697 採藥人的路徑

這是個思路題,對我這樣的zz 來說可能已經接近自己想出來的極限了。一看統計符合條件的路徑條數,肯定是點分治,而且肯定是靜態的。首先把邊權變成 1 和 1 那麼一條路徑陰陽平衡也就是說它的權值和等於 0 根據點分治的過程,可知重心和路徑是一對多的關係,而且一條路徑只會對應乙個重心,就是說每條路徑都只會...

bzoj3697 採藥人的路徑

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