• cojs 简单的求和问题 解题报告


    一个上午写了两个数据生成器,三个暴力和两个正解以及一个未竣工的伪正解思路

    真是累死本宝宝了

    首先这个题目暴力我的数据是有很多良心分的

    但是不同的暴力拿到的分数也会有所差距,由于是题解就不说暴力怎么写了

    首先第一种解法:

    我们对f序列分块,预处理a序列中每个点在每个块内会被计算多少次

    预处理的时候对于每个块把所有区间差分一下,然后O(N)扫一遍统计即可

    考虑我们的查询,一定是若干单点和若干块

    所以修改我们可以对f序列中所有的块暴力计算贡献

    由于已经预处理过,所以这是很好解决的,这样我们就可以解决块的询问了

    之后我们考虑对于单点的询问,显然就变成了求a序列的区间和

    可以用树状数组在修改log,查询log的时间内完成

    总时间复杂度O(n*sqrt(n)*logn)

    但是我们可以做到更好,考虑我们实际上修改的次数较少,查询次数较多

    所以我们可以采用sqrt(n)修改,O(1)查询的方式来维护

    显然我们要对a序列分块,维护a序列的前缀和,每次修改等于把Si-Sn每个数加上一个数

    查询的时候只需要返回 单点的值和块的值的和就可以了

    这样总时间复杂度O(n*sqrt(n)),空间复杂度O(n*sqrt(n))

    但是如果我丧心病狂一点,强行卡内存呢?

    下面介绍第二种解法:

    我们把询问离线,就可以把修改操作改成增量操作啦

    这样贡献就被分离了,一个询问的答案等于块内贡献和之前块贡献的和

    首先之前块的贡献的和我们可以通过每次暴力重构前缀和数组做到O(n*sqrt(n))的时间复杂度

    块内贡献不是很好算,由于区间和具有可减性,我们可以把一个询问拆成两个前缀和询问

    之后我们把所有询问按询问端点从小到大排序,扫每一个询问

    之后扫这个询问块内的在它之前的修改来计算贡献,那么我们显然要知道这个修改的点要被计算多少次

    我们可以在扫描过程中维护一个数据结构满足区间+1,查询单点值

    用树状数组可以做到log修改,log查询,时间复杂度O(n*sqrt(n)*logn)

    同理我们一样可以转化为sqrt(n)修改,O(1)查询,做法和上面的同理,对a序列分块即可

    时间复杂度O(n*sqrt(n)),空间复杂度O(n)

    但是如果我再丧心病狂一点,还要求强制在线呢?

    这个题还是可做的,不过做法要多个log,如果谁有更好的做法欢迎与我联系

    第三种解法:

    我们考虑我们计算某个修改对某个询问的贡献的时候需要的信息

    由于我们把询问拆成了前缀和询问,我们只需要知道在f序列中[1-i]这些的f值中ak被计算了多少次

    在上一种做法中我们离线排序来计算的这些信息,需要维护的数据结构支持区间修改,单点查询

    我们不妨差分一下,转化成单点修改,区间查询

    然后我们就可以用可持久化线段树来预处理啦

    之后我们读入询问,每sqrt(n)暴力重构一次前缀和,暴力扫块内之前操作计算贡献就可以啦

    时间复杂度O(n*sqrt(n)*log(n)),空间复杂度O(n*logn)

    这个做法貌似并不能在cojs上跑过去,不过也是一个蛮不错的idea

    实测最后两个点会T掉,貌似时限在开大0.5s就能跑过去啦

    UPD:对于第二种做法,目前比第一种做法要快

    而且本人的写法比较辣鸡,如果第二种做法将修改和查询分开就会减少很多无用的扫描

    可以减小常数,貌似可以跑的更快?不过代码量和细节肯定会增多QAQ

    由于本人丧心病狂,已经卡了内存

  • 相关阅读:
    MS CRM 2011的自定义和开发(11)——插件(plugin)开发(四)
    MS CRM 2011的自定义和开发(11)——插件(plugin)开发(一)
    MSCRM Plugin Debug
    MS CRM 2011的自定义和开发(11)——插件(plugin)开发(二)
    [转].net 使用NPOI或MyXls把DataTable导出到Excel
    HTML5的十大新特性
    语义化的HTML及其目的
    XHTML和HTML有什么区别
    浏览器根对象document之方法概述
    浏览器根对象document之数值和布尔属性
  • 原文地址:https://www.cnblogs.com/joyouth/p/5492109.html
Copyright © 2020-2023  润新知