8.23模拟赛

来源:互联网 发布:死神人物能力数据 编辑:程序博客网 时间:2024/06/13 01:51

T1 第一眼主席树!!!肯定会T。
     然而把数按照从小到大的顺序删除,用一个双向链表维护当前数组,
1)枚举即将删除的数x,往左跳k-1个数;
2)然后看当前区间往左右有多少个空格,乘一下即为这K个数为前K大且x为第K大的方案数,再将整个区间往右移;
3)重复流程2),直到x成为了区间最左端的点。
时间:O(NK)

T2 有个结论,将B数组排完序后,最优解之一满足AN+kBk下图给出简单证明:
这里写图片描述
1式等于3式原因是3式在N之后的红色部分一定小于前面,可以忽略不计。所以有AN+1B1,同理可以往后面推。
因此一开始预处理出f[i]数组,表示a[i~N]中最大的a[i]-i,对B排序后,按照结论贪心,维护一个tmp,为最大的a[N+j]-(N+j),每次和f[j]取max后,更新tmp即可。
时间:O(NlogN+N

T3 对于每个数字k,算出它出现在X个不同矩阵里,对答案贡献即X。枚举行列i,j,对于第j列维护一个pos【j】【k】,表示在第j列最靠下的k值所在行。为了避免重复计算,在计算的矩阵中应该不出现之前的k,所以对于当前行i到第j列上一个k的位置pos【j】【k】,枚举一个矩阵的上界K,然后往左右延伸最远处L,R,然后矩阵的下界即为n行。
这里写图片描述
最后累加 (ni)(jl)(rj)即可.
时间:ON4)

AC代码:
T1:http://paste.ubuntu.com/25423583/
T2:http://paste.ubuntu.com/25423584/
T3:http://paste.ubuntu.com/25423585/

原创粉丝点击