UOJ191口胡
UOJ191,你失败的原因只有一个:你没有强制在线。
首先这个序列末位加加减减很烦,于是换成操作树,这样就变成查询链的信息了。
注意到一个向量 \((x_1,y_1)\) 比 \((x_2,y_2)\) 优秀的条件是 \(x_1*B-y_1*A>x_2*B-y_2*A\),也就是 \((x_1-x_2)*B>(y_1-y_2)*A\),\(\frac B A<\frac {y_1-y_2}{x_1-x_2}\)。
于是树剖。
容易发现询问是由链上若干个前缀与一个区间组成的。于是我们似乎只需要实现一个可持久化分块,然后在上面二分即可。
但是最后那个区间怎么办?别急,我们后面再进行讨论。
如果直接使用平衡树复杂度应该是十分优秀的 \(O(m\log^2n)\),加上平衡树的大常数能过就有鬼了。
考虑进行神秘优化。
将对前缀的询问拆下来,然后提前对每条链建立好凸包,凸包应该包含的信息有坐标和在树上的深度。然后离线对斜率排序。
对斜率排序的实现如果不精细是 \(O(m\log^2n)\) 的,考虑先把所有询问向量排序,然后对斜率排序就变为对下标排序,此时使用桶排序即可。
每次询问之前将凸包的指针向后跳(相当于预处理处理二分的位置),因为每个数最多被跳一次所以是 \(O(n)\) 的。
每次询问凸包时需要询问凸包上的“前驱”(前面第一个没被标记的)和“后继”(类似前者),将查询的位置与查询的值再次离线下来。
现在的问题变为查询序列上前面第一个比自身小的值与后面第一个比自身小的值。
将序列的元素从大到小排序,每扫到一个元素就将自己与前面的元素合并,然后前面第一个比自身小的值相当于前面第一个块的最后一个元素,后继同理。
使用并查集即可做到 \(O(m\log n\alpha(n))\)。每条链内部的排序使用桶排序即可保证复杂度。
实际上建立凸包的时候要删点,导致最优决策可能已经被 gank 了。
于是考虑把对序列建立凸包改成对一棵树的每个节点到根的路径建立凸包,问题也就变为查询深度最大的祖先并且满足权值小于某个值。
并查集依旧可以解决这个问题,并且也存在 \(O(n+m)\) 的严格线性树上并查集。
但是这样应该如何对斜率排序呢?
考虑到对斜率排序之后遍历的顺序相当于对这棵树进行 BFS,所以我们每“遍历”到一个节点就对其打上标记,查询变为查询最深的被标记的祖先。
老样子时光倒流,变为查询所在连通块最浅的节点的父亲,仍然可以 \(O((n+m)\alpha(n))\) 或 \(O(n+m)\)。
但是你一共有 \(O(m\log n)\) 个询问啊?
对询问分块,分成 \(\log n\) 块,每一块只有 \(O(m)\) 个询问,这样子离线就可以接受了。
但是别忘了还有一些区间。但是数量已经降低到 \(O(m)\) 个了。
前面的无法故技重施,原因是找不到对应的节点。
于是考虑对这条链进行猫树分治,做一个前缀凸壳与后缀凸壳。分治的复杂度为 \(O(n\log n)\),查询因为只需要查询一个前缀一个后缀所以直接二分,复杂度 \(O(m\log n)\),空间复杂度 \(O(n+m)\)。
最终复杂度 \(O(n\log n+m\log n\alpha(n))\) 或 \(O((n+m)\log n)\),空间复杂度 \(O(n+m)\),可以通过此题。
因为代码太难写了,所以先鸽子了,回头来补(
UOJ191口胡的更多相关文章
- Topcoder口胡记 SRM 562 Div 1 ~ SRM 599 Div 1
据说做TC题有助于提高知识水平? :) 传送门:https://284914869.github.io/AEoj/index.html 转载请注明链接:http://www.cnblogs.com/B ...
- 口胡FFT现场(没准就听懂了)&&FFT学习笔记
前言(不想听的可以跳到下面) OK.蒟蒻又来口胡了. 自从ZJOI2019上Day的数论课上的多项式听到懵逼了,所以我就下定决心要学好多项式.感觉自己以前学的多项式都是假的. 但是一直在咕咕,现在是中 ...
- BZOJ 口胡记录
最近实在是懒的不想打代码...好像口胡也算一种训练,那就口胡把. BZOJ 2243 染色(树链剖分) 首先树链剖分,然后记录下每个区间的左右端点颜色和当前区间的颜色段.再对每个节点维护一个tag标记 ...
- Atcoder/Topcoder 口胡记录
Atcoder/Topcoder 理论 AC Atcoder的❌游戏示范 兴致勃勃地打开一场 AGC 看 A 题,先 WA 一发,然后花了一年时间 Fix. 看 B 题,啥玩意?这能求? 睡觉觉. e ...
- NOIP2016考前做题(口胡)记录
NOIP以前可能会持续更新 写在前面 NOIP好像马上就要到了,感觉在校内训练里面经常被虐有一种要滚粗的感觉(雾.不管是普及组还是提高组,我都参加了好几年了,结果一个省一都没有,今年如果还没有的话感觉 ...
- 关于有向图走“无限次”后求概率/期望的口胡/【题解】HNCPC2019H 有向图
关于有向图走"无限次"后求概率/期望的口胡/[题解]HNCPC2019H 有向图 全是口胡 假了不管 讨论的都是图\(G=(V,E),|V|=n,|E|=m\)上的情况 " ...
- 「口胡题解」「CF965D」Single-use Stones
目录 题目 口胡题解 题目 有许多的青蛙要过河,可惜的是,青蛙根本跳不过河,他们最远只能跳 \(L\) 单位长度,而河宽 \(W\) 单位长度. 在河面上有一些石头,距离 \(i\) 远的地方有 \( ...
- PKUSC 2022 口胡题解
\(PKUSC\ 2022\)口胡题解 为了更好的在考试中拿分,我准备学习基础日麻知识(为什么每年都考麻将 啊啊啊) 首先\(STO\)吉老师\(ORZ,\)真的学到了好多 观察标签发现,这套题覆盖知 ...
- 「线性基」学习笔记and乱口胡总结
还以为是什么非常高大上的东西花了1h不到就学好了 线性基 线性基可以在\(O(nlogx)\)的时间内计算出\(n\)个数的最大异或和(不需要相邻). 上述中\(x\)表示的最大的数. 如何实现 定义 ...
随机推荐
- uniapp 小程序全屏的实现
通过设置navigationStyle, 即自定义导航实现背景全屏 参考文章: 微信小程序 自定义头部导航栏 navigationStyle 代码部分 在page.json中, 加入 "n ...
- Loadrunner 11 中的Java Vuser
Java vuser是自定义的java虚拟用户脚本,脚本中可以使用标准的java语言. 1.安装jdk 注意,lr11最高支持jdk1.6 2.配置环境变量 3.在lr中选择java vuser协议 ...
- 用Java模拟实现对系统文件以目录的拷贝功能
要用Java对单个文件拷贝的话,其实思路很简单,循环读取被拷贝文件,放入byte数组,然后写入目标文件.当然我们也可以借助现有的类去完成,如InputStream中的transferTo()方法就可以 ...
- 框架4--NFS网络共享
目录 框架4--NFS网络共享 1.练习 2.昨日问题 3.今日内容 4.NFS简介 5.NFS应用 6.NFS实践 6.1.服务端 6.2.客户端 7.NFS配置详解 8.搭建考试系统 8.1.搭建 ...
- Winds10 安装JDK8.0教程
首先下载一个jdk,可以通过这个链接下载:https://pan.baidu.com/s/1aP6SdL8UQK_C2GvALLb6Wg也可以去官网下载:https://www.oracle.com/ ...
- 关于 Word2Vec 使用时遇到的一系列问题!!
1 训练时 model = Word2Vec(x, size=250, window=5, min_count=5, workers=12, iter=10, sg=1) 这句代码一直报错 查了 ...
- Blazor和Vue对比学习:说在开始前
1.Vue:现代前端三大框架之一(Vue/React/Angualr),基于HTML.CSS和JavaScript,2014年正式对外发布,目前已发展到3.X版本.值得说道的是,Vue的创始人作者是华 ...
- Zabbix是什么?
概述 Zabbix 是一个企业级的分布式开源监控方案,可以监控服务器健康性以及网络参数的一款软件,Zabbix几乎可以为任何时间配置邮件警告,这样用户可以实时通过邮箱接收服务器所发生的任何问题.对于已 ...
- maven配置本地仓库和远程仓库
配置本地仓库 修改maven安装目录下conf/settings.xml,也可以在idea配置中覆盖 <localRepository>E:\maven\MavenRepository&l ...
- video视频控件
<!-- 视频播放内容 --> <!-- autoplay准备就绪会自动播放 --> <!-- controls,要自定义得去掉这个 --> <video ...