码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-10-29 09:41:23      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:合并   位置   结构   and   衣服   出现   font   color   时间   

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

 

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

标签:合并   位置   结构   and   衣服   出现   font   color   时间   

原文地址:https://www.cnblogs.com/Wwb123/p/11756577.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!