小道士的矯情之路;
點分治,
對於每個子樹,處理其內經過根(重心)的路徑,然後遞迴下一層子樹;
如何處理經過根的合法路徑
合法有兩個要求;
把輸入的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?)
由於這裡細節極多,不好全部言明,故直接看**:
1view codelong
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)
由於這個操作是單次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 採藥人的藥田是乙個樹狀結構,每條路徑上都種植著同種藥材。採藥人以自己對藥材獨到的見解,對每種藥材進行了分類。大致分為兩類,一種是陰性的,一種是陽性的。採藥人每天都要進行採藥活動。他選擇的路徑是很有講究的,他認為陰陽平衡是很重要的,所以他走的一定是兩種藥材數目相等的路徑。採藥工...