Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

一个小技巧

Posted by spb3732 at 2013-01-05 22:30:39 on Problem 1182
本人用并查集解的,推导相互之间的关系时废了很长时间。以下这个小技巧或许可以帮助大家少走一点弯路

kind[a]=0表示a与父节点属于同一类。kind[a]=1表示a吃父节点。kind[a]=2表示父节点吃a。 (后二种情况下的赋值可以改变,但对后续有点小影响)

1.有一种关系b是a父节点,c是b父节点,  a与c的关系可以表示为 (kind[a]+kind[b])%3    (延续性,适用于多个节点的延续,如3个节点根据二次计算即可完成)

2.b是a的父节点,表示为kind[a].  若父子节点相互反转,即a是b的父节点,kind[b]=(3-kind[a])%3  (反转性)

根据延续性和反转性可计算任何两个节点之间的关系,以下是几个例子:

现在讨论并查集中用到关系的3中情况:
(i):find中的更新,x的父节点是y,y的父节点为根节点,将关系更新为x的父节点为根节点,表示为:kind[x]=(kind[x]+kind[y])%3;
(ii)并查集中的合并。  假设x的父节点是xx  y的父节点是yy  x和y的关系为d。
若将xx的父节点更新为yy,则 kind[xx]=kind[x]的反转(即xx的父节点为x)+d(x的父节点为y)+kind[y](y的父节点为yy),
简化为kind[xx]=(3-kind[x]+d+kind[y])%3.
(iii)并查集中判断x,y是否冲突
x和y的父节点都为同一个根节点,知道kind[x],kind[y],d(表示x和y的关系)
  3-kind[x](x的反转,根节点->x)+d(x->y)+kind[y](y->根节点)  根据延续性这个式子表示为  根节点->根节点的关系  即 (3-kind[x]+d+kind[y])%3==0

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator