这里不讲题,主要写方法
题目链接:https://www.luogu.org/problem/show?pid=1020
Dilwroth定理。
应用:求覆盖整个序列不下降子序列最小数量
标准LIS,使用upper_bound(),初值赋最大
1 int lis(){ 2 maxloc=0; 3 memset(seqend,0x3,sizeof(seqend)); 4 loop(i,cnt){ 5 int* loc=upper_bound(seqend+1,seqend+n+1,num[i]); 6 *loc=num[i]; 7 maxloc=max(maxloc,int(loc-endp)); 8 } 9 return maxloc; 10 }
Dilworth,使用lower_bound(),初值赋最小
int dilworth(){ maxloc=0; memset(seqend,-1,sizeof(seqend)); loop(i,cnt){ int* loc=lower_bound(seqend+1,seqend+n+1,num[i],greater<int>()); *loc=num[i]; maxloc=max(maxloc,int(loc-endp)); } return maxloc; }
max(int,long)不会匹配,所以需要强制类型转换。(long是默认指针减法数值)