cdq分治时,cmp
函数应该按什么原则来写?是按照点对贡献的顺序,将提供贡献的放在左边,统计贡献的放在右边吗?
什么时候判等号,什么时候需要顾及更高维的属性,什么时候比较当前这一维就可以了?
见过的有这样的(P3364, R227753102):
bool cmpd1(Node a,Node b){return a.d1<b.d1;}
bool cmpd2(Node a,Node b){return a.d2<b.d2;}
bool cmpd3(Node a,Node b){return a.d3<b.d3;}
这样的(P2487, R227690220):
bool cmpb(Node a,Node b){return a.b<b.b;}
bool cmpa(Node a,Node b){return a.a==b.a?a.id<b.id:a.a<b.a);}
这样的:
bool cmpd3(Node a,Node b){return a.d3==b.d3?a.d4<b.d4:a.d3<b.d3;}
bool cmpd2(Node a,Node b){return a.d2==b.d2?cmpd3(a,b):a.d2<b.d2;}
bool cmpd1(Node a,Node b){return a.d1==b.d1?cmpd2(a,b):a.d1<b.d1;}
这样的:
inline bool cmpd3(Node a,Node b){return a.d3==b.d3?(a.d4==b.d4?(a.d1==b.d1?a.d2<b.d2:a.d1<b.d1):a.d4<b.d4):a.d3<b.d3;}
inline bool cmpd2(Node a,Node b){return a.d2==b.d2?(a.d3==b.d3?(a.d4==b.d4?a.d1<b.d1:a.d4<b.d4):a.d3<b.d3):a.d2<b.d2;}
inline bool cmpd1(Node a,Node b){return a.d1==b.d1?(a.d2==b.d2?(a.d3==b.d3?a.d4<b.d4:a.d3<b.d3):a.d2<b.d2):a.d1<b.d1;}
目前梳理出了一些关系:
stable_sort
,并使用第4种写法。stable_sort
,则使用第3/4种写法(R227758306)。sort
,则使用第4种写法(R227758651)。各种情况,要是逐个考虑倒也能理解得了,可是找不出普遍规律来,每次写cdq还是会头疼,只能凭感觉来写。请帮我梳理一下我混乱的思路~~~