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口胡的更多相关文章

  1. Topcoder口胡记 SRM 562 Div 1 ~ SRM 599 Div 1

    据说做TC题有助于提高知识水平? :) 传送门:https://284914869.github.io/AEoj/index.html 转载请注明链接:http://www.cnblogs.com/B ...

  2. 口胡FFT现场(没准就听懂了)&&FFT学习笔记

    前言(不想听的可以跳到下面) OK.蒟蒻又来口胡了. 自从ZJOI2019上Day的数论课上的多项式听到懵逼了,所以我就下定决心要学好多项式.感觉自己以前学的多项式都是假的. 但是一直在咕咕,现在是中 ...

  3. BZOJ 口胡记录

    最近实在是懒的不想打代码...好像口胡也算一种训练,那就口胡把. BZOJ 2243 染色(树链剖分) 首先树链剖分,然后记录下每个区间的左右端点颜色和当前区间的颜色段.再对每个节点维护一个tag标记 ...

  4. Atcoder/Topcoder 口胡记录

    Atcoder/Topcoder 理论 AC Atcoder的❌游戏示范 兴致勃勃地打开一场 AGC 看 A 题,先 WA 一发,然后花了一年时间 Fix. 看 B 题,啥玩意?这能求? 睡觉觉. e ...

  5. NOIP2016考前做题(口胡)记录

    NOIP以前可能会持续更新 写在前面 NOIP好像马上就要到了,感觉在校内训练里面经常被虐有一种要滚粗的感觉(雾.不管是普及组还是提高组,我都参加了好几年了,结果一个省一都没有,今年如果还没有的话感觉 ...

  6. 关于有向图走“无限次”后求概率/期望的口胡/【题解】HNCPC2019H 有向图

    关于有向图走"无限次"后求概率/期望的口胡/[题解]HNCPC2019H 有向图 全是口胡 假了不管 讨论的都是图\(G=(V,E),|V|=n,|E|=m\)上的情况 " ...

  7. 「口胡题解」「CF965D」Single-use Stones

    目录 题目 口胡题解 题目 有许多的青蛙要过河,可惜的是,青蛙根本跳不过河,他们最远只能跳 \(L\) 单位长度,而河宽 \(W\) 单位长度. 在河面上有一些石头,距离 \(i\) 远的地方有 \( ...

  8. PKUSC 2022 口胡题解

    \(PKUSC\ 2022\)口胡题解 为了更好的在考试中拿分,我准备学习基础日麻知识(为什么每年都考麻将 啊啊啊) 首先\(STO\)吉老师\(ORZ,\)真的学到了好多 观察标签发现,这套题覆盖知 ...

  9. 「线性基」学习笔记and乱口胡总结

    还以为是什么非常高大上的东西花了1h不到就学好了 线性基 线性基可以在\(O(nlogx)\)的时间内计算出\(n\)个数的最大异或和(不需要相邻). 上述中\(x\)表示的最大的数. 如何实现 定义 ...

随机推荐

  1. 电脑预装Office2016打开Word时点击保存弹出“word无法启动转换器RECOVR32.CNV”对话框问题的修复方法

    感谢大佬:https://blog.csdn.net/qq_41969790/article/details/85161701 1.问题描述:电脑预装的Office2016,家庭和学生版正版.每次打开 ...

  2. PyTorch深度学习入门笔记(一)PyTorch环境配置及安装

    @ 目录 一.工具安装 1.1 Anaconda 安装 1.2 Pytorch安装 二.编辑器安装 2.1 Pycharm安装 2.2 Jupyter安装 OS: ubuntu 20.04(虚拟机) ...

  3. SQL 在数据库中查找拥有此列名的所有表

    SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME='Column' #"Column"为要查询 ...

  4. spring mvc通过客户端传值,controller获取Sort对象

    之前客户端需要根据需求按不同的排序方式查看数据,按照一种约定排序,比如1代表时间升序,2代表时间降序,3,4这种形式,然后后台根据这些值创建Sort对象. 后来发现完全多此一举,可以根据特定的方式,直 ...

  5. 如何删除远端已经推送的Commit记录???(Git版本回退)

    如何删除远端已经推送的Commit记录???(Git版本回退) 简单描述 突然事件:刚刚,就在刚刚,发生误了操作. 操作描述:我把修改的文件保存错分支了,已经commit了.并且还push上去了.对, ...

  6. C# 实例解释面向对象编程中的里氏替换原则

    在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...

  7. 数据分析实际案例之:pandas在泰坦尼特号乘客数据中的使用

    目录 简介 泰坦尼特号乘客数据 使用pandas对数据进行分析 引入依赖包 读取和分析数据 图形化表示和矩阵转换 简介 1912年4月15日,号称永不沉没的泰坦尼克号因为和冰山相撞沉没了.因为没有足够 ...

  8. 乘风破浪,遇见未来元宇宙(Metaverse)之进入元宇宙世界,虚拟数字人行业洞察报告

    正值元宇宙热潮,虚拟数字人兴起 作为⼀个新兴领域,虚拟数字⼈已经引起市场和资本的⾼度关注,截⾄目前据不完全统计,全球范围已有500+虚拟数字人相关项目获得融资,融资总额超10亿美元,并且融资项目和总额 ...

  9. mysql基础复习(SQL语句的四个分类),

                                                                                                       ( ...

  10. C语言中左值和右值的理解

    左值顾名思义等号左边,右值等号右边. 左值一般指的内存占用的一个符号: 右值指的是常量或者常量表达式: 当然左值也可以通过一些常用的运算符,例如加减乘除/&转化为右值 注意:不是所有的变量都能 ...