5484: [Usaco2018 Dec]Sort It Out
https://www.lydsy.com/JudgeOnline/problem.php?id=5484
Sol.
考虑没有在被喊叫集合中的点,他们一定是上升的。
那么最小的集合大小就是n-最长上升子序列长度。
对于第二问,有个转化:因为给出的是排列,求第k小的集合相当于求第k大的最长上升子序列。
那么可以记f[i]表示以i为头的最长上升子序列长度,g[i]表示方案数,转移时一起转移。
用个vector存最长上升子序列长度为i的开头有哪些,然后从大到小贪心取。
有个技巧:树状数组可以反着用!
我们要把1~x取Max,查询x~n的最小值。
那么可以
for(int i=x;i;i-=i&-i)tr[i]=max(tr[i],v)
for(int i=x;i<=n;i+=i&-ii) sum=max(tr[i],sum)
画个图看看似乎只有取Max可以用