Luogu5611 Ynoi2013 D2T2/牛客挑战赛32F 最大子段和 分块、分治
之前一直咕着的,因为一些特殊的原因把这道题更掉算了……
有一个对值域莫队+线段树的做法,复杂度\(O(n\sqrt{n} \log n)\)然而牛客机子实在太慢了没有希望(Luogu上精细实现似乎可以过)。
考虑对序列进行块大小为\(B=\sqrt{n}\)的分块。对于某一个块来说,如果我们要对这个整块进行询问,那么一次询问一定会保留这\(B\)个数按照值域排序之后的一段区间,其余都变成\(0\)。也就是说本质不同的询问只有\(O(B^2)\)种。
如果可以对这\(O(B^2)\)种询问处理出每一种对应询问下这一块中的最大子段和、最大前缀和、最大后缀和和总和,那么对于一组询问就只需要把整块的信息拿过来把散块暴力合并就可以了。
注意到计算最大子段和具有结合律,我们考虑分治。当我们在解决一段区间\((l,r)\)时候,先从中间劈成\((l,mid)\)和\((mid+1,r)\)两半递归下去做,递归边界是\(l=r\)。接下来我们考虑当我们解决了\((l,mid)\)和\((mid+1,r)\)的问题时如何合并。
首先我们可以使用归并得到当前区间按照值域排序后的数组,然后我们需要通过左右两边得到的答案来得到左右端点分别取在其中某个位置的时候的答案。假设需要求值域左右端点为\((l,r)\)的答案,那么在左区间中找到最小的\(\geq l\)的值\(l_1\)和最大的\(\leq r\)的值\(r_1\),那么对于左区间来说询问\((l,r)\)等价于询问\((l_1,r_1)\),而后者在之前处理的答案里面存在。所以我们找到\(l_1,r_1\)就可以得到左区间的信息,右区间同理。我们可以通过这个方式来得到当前区间下的所有答案。
使用单调性将每一层合并的复杂度降低为区间长度的平方,那么分治的复杂度可以由\(T(n) = 2T(\frac{n}{2}) + O(n^2)\)计算,根据主定理\(T(n) = O(n^2)\)。也就是我们将所有块的答案预处理出来的复杂度是\(O(n \sqrt{n})\)的。
然后我们只需要对于每一次询问找到每一块内这组询问的值域区间对应在块上的哪一个区间。在线做需要二分,所以可以把询问离线下来,把所有需要求位置的所有值域位置先排序然后双指针求出对应位置。复杂度\(O(n \sqrt{n})\)。
题外话:这东西常数贼大,尽量避免使用STL是卡常的很好的选择……
Luogu5611 Ynoi2013 D2T2/牛客挑战赛32F 最大子段和 分块、分治的更多相关文章
- 牛客挑战赛36 G Nim游戏(分治FWT)
https://ac.nowcoder.com/acm/contest/3782/G 题解: 分治FWT裸题. 每个都相当于\((1+b[i]x^{a[i]})\),求这玩意的异或卷积. 先把a[i] ...
- 牛客挑战赛 39 牛牛与序列 隔板法 容斥 dp
LINK:牛牛与序列 (牛客div1的E题怎么这么水... 还没D难. 定义一个序列合法 当且仅当存在一个位置i满足 $a_i>a_,a_j<a_$且对于所有的位置i,$1 \leq a_ ...
- 牛客挑战赛 30 A 小G数数
题目链接:https://ac.nowcoder.com/acm/contest/375/A 分析:我写的时候竟然把它当成了DP....... 还建了个结构体DP数组,保存一二位,不知道当时脑子在抽啥 ...
- 良心送分题(牛客挑战赛35E+虚树+最短路)
目录 题目链接 题意 思路 代码 题目链接 传送门 题意 给你一棵树,然后把这棵树复制\(k\)次,然后再添加\(m\)条边,然后给你起点和终点,问你起点到终点的最短路. 思路 由于将树复制\(k\) ...
- 牛客挑战赛30 小G砍树 树形dp
小G砍树 dfs两次, dp出每个点作为最后一个点的方案数. #include<bits/stdc++.h> #define LL long long #define fi first # ...
- 牛客挑战赛30D 小A的昆特牌(组合数学)
题面 传送门 题解 很容易写出一个暴力 \[\sum_{i=l}^r {i+n-1\choose n-1}{s-i+m\choose m}\] 即枚举选了多少个步兵,然后用插板法算出方案数 我们对这个 ...
- 牛客挑战赛30-T3 小G砍树
link 题目大意: n个节点的带标号无根树.每次选择一个度数为1的节点并将它从树上移除.问总共有多少种不同的方式能将这棵树删到只剩 1 个点.两种方式不同当且仅当至少有一步被删除的节点不同. 题解: ...
- 【牛客挑战赛30D】小A的昆特牌(组合问题抽象到二维平面)
点此看题面 大致题意: 有\(S\)张无编号的牌,可以将任意张牌锻造成\(n\)种步兵或\(m\)种弩兵中的一种,求最后步兵数量大于等于\(l\)小于等于\(r\)的方案数. 暴力式子 首先我们来考虑 ...
- 牛客挑战赛14-F细胞
https://www.nowcoder.com/acm/contest/81/F 循环卷积的裸题,太久没做FFT了,这么裸的循环卷积都看不出来 注意一下本文的mod 都是指表示幂的模数,而不是NTT ...
随机推荐
- Spark MLlib基本算法【相关性分析、卡方检验、总结器】
一.相关性分析 1.简介 计算两个系列数据之间的相关性是统计中的常见操作.在spark.ml中提供了很多算法用来计算两两的相关性.目前支持的相关性算法是Pearson和Spearman.Correla ...
- ASP.NET Core MVC 502 bad gateway 超时如何处理
在网页程序运行需要较长时间运行的时候,ASP.NET Core MVC会出现502 bad gateway请求超时情况.一般默认的超时时间都比较短,我们需要在 web.config 中配置一下.其中 ...
- Kotlin开发springboot项目(三)
Kotlin开发springboot项目(三) 在线工具 https://www.sojson.com IDEA中Kotlin生成可执行文件1,项目使用Gradle构建2,在model的build.g ...
- pycharm Launching unittests with arguments
在运行程序时出现 但是代码没有错 源代码是: 这是运行时启动了测试 解决方法: File-> Settings -> Tools -> Python Integrated Tools ...
- 两数相加[链表加法] LeetCode.2
给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...
- 51nod 1594 Gcd and Phi(莫比乌斯反演)
题目链接 传送门 思路 如果这题是这样的: \[ F(n)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\phi(gcd(i,j)) \] 那么我们可能会想到下 ...
- AXIOS 的请求
AXIOS 本质上等同于json 传值 1.引用 //引入axios import Axios from 'axios' //将axios挂载到 Vue原型上 Vue.prototype.$https ...
- opencart卸载语言包要记得在后台进行设置否则会出错
今天ytkah在一个项目中把中文包卸载了,但是前端购买按钮变为空了,研究了一遍发现要把system - localisation - languages中的对应语言删除才可以.正确的卸载语言步骤是1. ...
- 知识点6 C++数据类型转换 string
一.int转string 1.c++11标准增加了全局函数std::to_string: string to_string (int val); string to_string (long val) ...
- contest2 CF989 div2 ooox? ooox? oooo?
题意 div2C (o) 在\(小于50*50\)的棋盘上放\(A, B, C, D\)四种花, 并给出每种花的连通块数量\(a, b, c, d(\le 100)\), 输出一种摆法 div2D ( ...