求问cdq的cmp函数细节
  • 板块学术版
  • 楼主Sinktank
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/7/30 12:13
  • 上次更新2025/7/30 16:59:55
查看原帖
求问cdq的cmp函数细节
644112
Sinktank楼主2025/7/30 12:13

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,并使用第44种写法。
  • 如果序列无重复,或者进行了去重:
    • 如果使用stable_sort,则使用第3/43/4种写法(R227758306)。
    • 如果使用sort,则使用第44种写法(R227758651)。

各种情况,要是逐个考虑倒也能理解得了,可是找不出普遍规律来,每次写cdq还是会头疼,只能凭感觉来写。请帮我梳理一下我混乱的思路~~~

2025/7/30 12:13
加载中...