传送门


之前一直咕着的,因为一些特殊的原因把这道题更掉算了……

有一个对值域莫队+线段树的做法,复杂度\(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是卡常的很好的选择……

Code

Luogu5611 Ynoi2013 D2T2/牛客挑战赛32F 最大子段和 分块、分治的更多相关文章

  1. 牛客挑战赛36 G Nim游戏(分治FWT)

    https://ac.nowcoder.com/acm/contest/3782/G 题解: 分治FWT裸题. 每个都相当于\((1+b[i]x^{a[i]})\),求这玩意的异或卷积. 先把a[i] ...

  2. 牛客挑战赛 39 牛牛与序列 隔板法 容斥 dp

    LINK:牛牛与序列 (牛客div1的E题怎么这么水... 还没D难. 定义一个序列合法 当且仅当存在一个位置i满足 $a_i>a_,a_j<a_$且对于所有的位置i,$1 \leq a_ ...

  3. 牛客挑战赛 30 A 小G数数

    题目链接:https://ac.nowcoder.com/acm/contest/375/A 分析:我写的时候竟然把它当成了DP....... 还建了个结构体DP数组,保存一二位,不知道当时脑子在抽啥 ...

  4. 良心送分题(牛客挑战赛35E+虚树+最短路)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 给你一棵树,然后把这棵树复制\(k\)次,然后再添加\(m\)条边,然后给你起点和终点,问你起点到终点的最短路. 思路 由于将树复制\(k\) ...

  5. 牛客挑战赛30 小G砍树 树形dp

    小G砍树 dfs两次, dp出每个点作为最后一个点的方案数. #include<bits/stdc++.h> #define LL long long #define fi first # ...

  6. 牛客挑战赛30D 小A的昆特牌(组合数学)

    题面 传送门 题解 很容易写出一个暴力 \[\sum_{i=l}^r {i+n-1\choose n-1}{s-i+m\choose m}\] 即枚举选了多少个步兵,然后用插板法算出方案数 我们对这个 ...

  7. 牛客挑战赛30-T3 小G砍树

    link 题目大意: n个节点的带标号无根树.每次选择一个度数为1的节点并将它从树上移除.问总共有多少种不同的方式能将这棵树删到只剩 1 个点.两种方式不同当且仅当至少有一步被删除的节点不同. 题解: ...

  8. 【牛客挑战赛30D】小A的昆特牌(组合问题抽象到二维平面)

    点此看题面 大致题意: 有\(S\)张无编号的牌,可以将任意张牌锻造成\(n\)种步兵或\(m\)种弩兵中的一种,求最后步兵数量大于等于\(l\)小于等于\(r\)的方案数. 暴力式子 首先我们来考虑 ...

  9. 牛客挑战赛14-F细胞

    https://www.nowcoder.com/acm/contest/81/F 循环卷积的裸题,太久没做FFT了,这么裸的循环卷积都看不出来 注意一下本文的mod 都是指表示幂的模数,而不是NTT ...

随机推荐

  1. SPring boot jpa 封装查询条件

    最近使用spring data jpa做了两个项目,对于动态查询的不友好做了个类似hibernate的封装,记录也分享下 首先定义一个所有条件的容器,继承Specification /** * 定义一 ...

  2. MySQL事务优化

    ====================事务特性 事务隔离级别 事务控制语句 MySQL优化==================== 事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全 ...

  3. c++产生验证码字符串

    // // Created by lk on 18-10-14. // #include <iostream> #include <cstdlib> #include < ...

  4. 网络编程 TCP协议:三次握手,四次回收,反馈机制 socket套接字通信 粘包问题与解决方法

    TCP协议:传输协议,基于端口工作 三次握手,四次挥手 TCP协议建立双向通道. 三次握手, 建连接: 1:客户端向服务端发送建立连接的请求 2:服务端返回收到请求的信息给客户端,并且发送往客户端建立 ...

  5. Kdevelop的安装-2种方法

    使用 Ubuntu 的自带的源: sudo apt-get update sudo apt-get install kdevelop 这就可以了.update这部,假如不换源,更新非常慢.换源方法很简 ...

  6. Leecode之双指针及二分查找

    题目 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的 ...

  7. Java 的API(API: Application(应用) Programming(程序) Interface(接口))

    按 ctrl 点击查看源代码: 一.equals方法: 1.用于比较两个对象是否相同. 2.Objec 类中,若两边是引用数据类型,比较的是两个对象的内存地址. 3.Objec 类中,若两边是数值类型 ...

  8. csv与openpyxl函数

    csv 与openpyxl函数 csv函数 常用的存储数据的方式有两种--存储成csv格式文件.存储成Excel文件(不是复制黏贴的那种) 前面,我有讲到json是特殊的字符串.其实,csv也是一种字 ...

  9. [RN] 解决小米手机安装应用报:INSTALL_FAILED_USER_RESTRICTED问题

    解决小米手机安装应用报:INSTALL_FAILED_USER_RESTRICTED问题 https://blog.csdn.net/u013023845/article/details/821082 ...

  10. idea 2018.1 创建springboot开启找回Run Dashboard

    Run Dashboard 他是一个代替Run窗口的一个更好清晰简介的一个启动器.一般我们需要启动多个窗口时,Run窗口不能让我们直观的看到我们看到每一个端口的变化. 我们可以对比一下这个是Run D ...