首页 > 其他分享 >CF1864H Asterism Stream

CF1864H Asterism Stream

时间:2023-11-27 23:12:38浏览次数:29  
标签:frac log Stream CF1864H Asterism 矩阵 枚举 复杂度 转移

首先讲点正常想的到的做法。

首先转化成:计数 * + * + * * + * * 的序列,要求在序列最后一个操作后恰好 \(\ge n\),每个序列的贡献是 \(\frac{1}{2^{len}}\)。

枚举总共有多少个 *;枚举最后一个 + 之后有多少个 *

这样,最后一个 + 的贡献是确定的,那限制就是在最后一个 + 之前要求数字达到一个范围 \([l,r]\),则能在最后一次操作后恰好 \(\ge n\),这个范围不难算出。

我们只需要在前面的每个 * 之前插入若干个 +,每个 + 的贡献是 \(2\) 的若干次方。也就是转化成了:选若干个 \(1,2,..,2^k\) 中的数组成一个可重集,使得和在 \([l,r]\) 内。

差分转化成求 \([0,r]\) 的答案。

考虑若干个 \(2^i\) 的数从小到大相加合并成 \(sum\) 的过程,发现这个过程是唯一的,也就是每次选出最小的 \(2^i,...,2^j (i\le j)\) 合并成一个数 \(2^k\)(如果最后 \(sum\) 包含了 \(k\) 这个二进制位)。

可以数位 dp。设 \(f(i,j,0/1)\) 表示当前决定了 sum 的最低 \(i\) 位的值,当前使用的最大数为 \(2^j\),是否卡满上界。预处理用 \(2^i,...,2^j (i\le j)\) 合并成 \(2^k\) 的总权值即可。

一次 dp 复杂度为 \(O(\log^3 V)\)。此时发现我们不需要枚举总共有多少个 *,外层只需要枚举 \(O(\log V)\) 次,于是总复杂度 \(O(T\log^4 V)\).






接下来是 dyh 的牛逼做法。

考虑 dp 转移方程:

\(f_i = \frac{1}{2} \times f_{i/2} (i\bmod 2 \equiv 0)\)
\(f_i = \frac{1}{2} \times f_{i/2} + \frac{1}{2} f_{i-1} (i\bmod 2 \equiv 1)\)

考虑想转移 \(f_i\) 要用到什么(考虑需要记录哪些信息才能封闭)。

\(i\) 是偶数时用到 \(f_{i/2}\);\(i\) 是奇数时用到 \(f_{i/2},f_{i-1}\)。

发先递归下去,相当于会用到所有 \(f_{\lfloor i/{2^k} \rfloor}\) 与 \(f_{\lfloor (i-1)/{2^k}\rfloor}\) 的值。

于是对于当前状态记录一个 \(\log V\) 长度的向量 \(A_i\),表示所有的 \(f_{\lfloor i/{2^k} \rfloor}\),为了方便设 \(f_0 = 2(f_1=\frac{1}{2}\times f_0)\)。

那么从 \(i-1\) 的向量到 \(i\) 的向量就是乘一个转移矩阵。

然后列出转移矩阵会发现,转移矩阵只和 \(i\) 的末尾 0 个数相关,也就是只有 \(\log\) 种不同的转移矩阵!(这也太神奇了)

那我们要求的就是初始向量 \(A_0\) 乘上转移矩阵的前缀积,每次询问会乘 \(\log V\) 个矩阵,复杂度 \(O(\log^3 V)\)。

转移矩阵的前缀积不难倍增预处理。时间复杂度 \(O(\log^4 V+T\log^3 V)\)。

标签:frac,log,Stream,CF1864H,Asterism,矩阵,枚举,复杂度,转移
From: https://www.cnblogs.com/Rainbowsjy/p/17860716.html

相关文章

  • nginx添加nginx_upstream_check_module模块,Linux下
    1、下图为本地虚拟机nginx目录2、cd./nginx-1.14.2进入nginx目录输入命令:patch-p1<../nginx_upstream_check_module-master/check_1.14.0+.patch  3、yum-yinstallgcc-c++pcrepcre-develzlibzlib-developensslopenssl-devel--  ./configure--prefix......
  • Stream Control Transmission Protocol 流控制传输协议
    StreamControlTransmissionProtocol-Wikipediahttps://en.wikipedia.org/wiki/Stream_Control_Transmission_Protocolhttps://zh.wikipedia.org/wiki/流控制传输协议流控制传输协议(英语:Stream Control Transmission Protocol,缩写:SCTP)是在2000年由IETF的SIGTRAN工作组定......
  • Java读取文件-BufferedReader/FileReader/InputStreamReader/FileInputStream的关系和
    本文根据文章:https://blog.csdn.net/wjp0000/article/details/117771752进行修改一、Java读取和存储文件数据流Java读取文件,实际是将文件中的字节流转换成字符流输出到屏幕的过程这里面涉及到两个类:InputStreamReader和OutputStreamWriterInputStreamReader:将字节流转换成字......
  • litestream sqlite流式复制工具
    litestream是基于golang开发的sqlite流式复制工具,可以方便的复制数据到s3或者一些共享存储中说明litestream使用简单,对于一些基于sqlite的db存储的应用备份,是一个很不错的选择(比如默认的grafana,proxysql)同时litestream对于s3兼容的存储支持也很不错(minio)值得试用下参考资料......
  • Java Stream中的API你都用过了吗?
    公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。在本教程中,您将通过大量示例来学习Java8StreamAPI。Java在Java8中提供了一个新的附加包,称为java.util.stream。该包由类、接口和枚举组成,允许对元素进行函数式操作。您可以通过在程序中......
  • Spark Streaming快速入门
    SparkStreaming快速入门一、简介SparkStreaming是构建在SparkCore基础之上的流处理框架(但实际上是微批次处理框架),是Spark非常重要的组成部分。严格意义上来讲,SparkStreaming是一个准实时,微批次的流处理框架。特点:Easytouse:简单易用;Unifiedbatchandstreami......
  • jdk8 Stream流中将集合转成map,重复key处理,统计最大值,获取某个属性集合等10种最常用方
    jdk8Stream流中将集合转成map,重复key处理,统计最大值,获取某个属性集合等10种最常用方法......
  • Flutter/Dart第21天:Dart异步编程(Future/Stream)
    Dart官方文档:https://dart.dev/language/async重要说明:本博客基于Dart官网文档,但并不是简单的对官网进行翻译,在覆盖核心功能情况下,我会根据个人研发经验,加入自己的一些扩展问题和场景验证。Future处理我们有2种方式编写Future异步代码:使用async和wait关键字使用FutureAPI(ht......
  • Nginx+upstream针对后端服务器容错的配置说明
    Nginx+upstream针对后端服务器容错的配置说明  熟练掌握Nginx负载均衡的使用对运维人员来说是极其重要的!下面针对Nignx负载均衡upstream容错机制的使用做一梳理性说明:一、nginx的upstream容错1)nginx判断节点失效状态Nginx默认判断失败节点状态以connectrefuse和timeou......
  • wcf restful 用stream接收表单数据并解析
    1.下载包HttpMultipartParser 2.服务端代码publicboolUpload(Streamstream){varparser=MultipartFormDataParser.Parse(stream);//解析streamvarfile=parser.Files.First();//获取文件stringfilename=file.Fi......