Replies: 1 comment
-
subtask
|
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
statement
ให้ undi unweighted connected tree แต่ละ node มี '(' หรือ ')' อันใดอันนึงเพียงอันเดียว ขนาด N nodes node: 1 -> N และให้คู่โหนด (U,V)
ถามว่ามีกี่คู่โหนด (x,y) ที่เมื่อสร้างเส้นเชื่อมระหว่าง (x,y) แล้วจะทำให้สามารถ
เดินจาก U ไป V ผ่านเส้นเชื่อม x,y ใหม่ แล้วได้ sequence ที่ valid ; (U->(x-y)->V)
sequence ของ walk คือ sequence วงเลบของแต่ละโหนดที่เดินผ่านมาต่อกัน ต้องเกบทุกอัน ห้ามสลับที่
valid sequence ก็คือ valid paranthesis sequence
concept
ให้ '(' เป็น +1 และ ')' เป็น -1 โดยคานวณ validity จาก sum ของทั้ง seq (ต้องเท่ากับ 0) และ min ของทุก prefix sum (ต้องไม่น้อยกว่า 0)
DFS จาก u ไปทุกโหนด และจาก v ไปทุกโหนด
แต่ละโหนด i เก็บ min ของทุก prefix sum และ sum ของ u->i และ i->v
คู่โหนด (x,y) ที่ใช้ได้ คือคู่ที่ sum(u->x)+sum(y->v) = 0 และ min-prefix-sum(u->x) >= 0 and sum(u->x) >= min-prefix-sum(y->v)
complexity: O(N lg N)
input
บรรทัดแรก มีตัวเลขสามตัว N U V
บรรทัด 2 ถึง N มีตัวเลขสองตัว ui vi แสดงถึงว่า มีเส้นเชื่อมระหว่าง ui vi
บรรทัด N+1 มี string S ยาว N ตัว โดย si (0<=i<N) เป็น '(' หรือ ')' แสดงถึงวงเล็บที่มีในโหนด i+1
output
บรรทัดเดียว มีตัวเลขหนึ่งตัว K แสดงถึงจำนวนคู่โหนด (x,y)
Beta Was this translation helpful? Give feedback.
All reactions