A. Dove 打扑克
考场思考半天线段树树状数组,没有什么想法
打完暴力后突然想到此题用链表实现会很快。
因为只有$n$堆,所以设最多有$x$个不同的堆数,那么$x\times (x-1)/2==n$,
所以链表中最多有$\sqrt{n}$个元素,
所以可以用一个$set$维护当前的出现元素,每次$upper\_bound$找到合适位置插入链表,
因为当前元素有序所以可以统计链表后缀来求答案
知识点:
不要在T1花太长时间,数据结构题可能只用到一些简单数据结构
B. Cicada 与排序
很好的概率题,感谢zkt大神讲解。
首先处理两个数组$f_{i,j}\ h_{i,j}$
分别表示在一次合并中,第j个数放到了大的序列的第i个位置的概率。
第二个表示此时右区间已经放完的概率,两者都是对于同一元素而言
然后在处理中我们用到$dp_{i,j,k}$表示归并中的第$i$层原序列第$j$个位置放在同元素序列的排名第k的位置的概率
然后转移时需要枚举每一层中同元素左边放多少右边放多少,乘积累加。
C. Cicada 拿衣服
考场很难想到这样的思路
首先对于$or-and$来说我们固定一个端点后最多有$2*log(a_{i})$这是针对二进制每一位而言的
我们用链表维护对于一个端点的值相同的区间的右端点
每次循环右端点时将链表中的的相同值合并,保证表中只有$log(n)$个元素
然后可以用$ST$表预处理出这4项操作
每次从左向右每次跳找到第一个符合的值,再在这段小区间里二分
时间复杂度$O(n*log(a_{i})*log(a_{i}))$.
原文地址:https://www.cnblogs.com/Wwb123/p/11756577.html
时间: 2024-10-01 21:22:23