一、题目
二、解法
设 f [ i ] f[i] f[i]为以 i i i点结束的最长不降子序列个数,可以 c d q cdq cdq分治,递归的时候我们已经处理出了 [ l , m i d ] [l,mid] [l,mid]的 f f f值,我们要拿他去更新 [ m i d + 1 , r ] [mid+1,r] [mid+1,r]的 f f f值,需要满足 h i ≥ h j , v i ≥ v j h_i\geq h_j,v_i\geq v_j hi≥hj,vi≥vj才能更新,所以我们先按 h h h从大到小排序,然后维护出一个最大值的线段树(跟经典的三维偏序十分类似),然后我们递归 [ m i d + 1 , r ] [mid+1,r] [mid+1,r],实现中有一个细节,就是最开始要按 t t t(给出时间)排序,因为顺序可能被打乱了。
第一问就解决了,第二问的话就在 d p dp dp过程中维护一个方案数(线段树里同时也需要),我们处理出以 i i i结尾的最长不降子序列,以 i i i开始的最长不降子序列,处理方法就是反向跑两遍,就能判断一个点是否在最优解中,然后用乘法原理把两者的方案数乘起来,除以总最优解个数就是概率。
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#