可以发现对于一个集合内的数无论怎么操作
都只会改变这些数的相对位置,而补集没有一点变化所以我们要求所有非集合的数必须是单调递增的(否则无论怎么操作都不能满足有序)
则集合内的数要单调递减
则我们要求的是字典序第kkk小的最长下降子序列
对偶转换就变成了求字典序第kkk大的最长上升子序列
我们考虑倒序处理,对于每一个长度,维护一下哪些开头的lislislis长度为iii,有多少个()
然后每次贪心取一下就是了
代码:
#includeusing namespace std;#define int long longinline int read(){ char ch=getchar(); int res=0,f=1; while(!isdigit(ch))ch=getchar(); while(isdigit(ch))res=(res<<3)+(res<<1)+(ch^48),ch=getchar(); return res;}const int N=100005;int n,k,a[N],b[N],c[N],vis[N];const int inf=1e18;struct zxyakioi{ int maxn,cnt; inline friend void operator +=(zxyakioi &a,zxyakioi &b){ if(a.maxn