「10.28」Dove 打扑克(链表)·Cicada 与排序(概率)·Cicada 拿衣服(各种数据结构)

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}))$.

猜你喜欢

转载自www.cnblogs.com/Wwb123/p/11756577.html
今日推荐