zoukankan      html  css  js  c++  java
  • 2016多校8th 1008【线段树-神题】

    题意:

    T
    N M
    N个数
    M个操作
    一个数组A,
    有3个操作
    1 l r x,a[l]…a[r]都+x
    2 l r,a[i]=sqrt(a[i]),l<=i<=r
    3 l r,求和,a[i], l<=i<=r
    操作3的时候输出
    n,m(1<=n,m<=100000).
    1<=A[i],x<=100000.

    思路:

    前言(读者可略过,看了请小喷qaq,欢迎指出错误):

    我突然开始困惑复杂度的问题:
    如果区间内所有的数都不相等,那么每次sqrt一下的时间复杂度多少?O(nlogn)?不是,翻书可知建树的时间复杂度是o(n)(因为节点数是2n),所以这里如果对区间所有数都sqrt一次也是o(n)啊。
    那什么是O(logn),对于单值改变和区间查询是O(logn),因为复杂度只是树的深度。
    正言:

    以前写过一题hdu4027,也是线段树维护开方的,但是只有开方,我们都知道,在一定范围内开方没几次就是1了,这里不一样,这里还有加操作。。。这就不知道了。。。呜呜呜。。。
    然后看了很多博客说是,某些区间内开几次就会变成1,然后标记一下区间是不是全部相等。。。
    说实话,还是没怎么懂。。。
    问题就是:
    如果我就是数据是在一个大区间sqrt一下,然后再在这个大区间加一下,一直m次…那不是也就是时间复杂度爆炸么?
    然后hdu上还加了一个毒数据(膜拜各种会玩dalao)。。
    2 3 2 3 2 3 …
    8 9 8 9 8 9 … (+6)
    2 3 2 3 2 3 … (sqrt)
    8 9 8 9 8 9 … (+6)
    2 3 2 3 2 3 … (sqrt)
    这个数据说明了我很可能办到这样不相等的情况,然后有了一个优化解法,原文:“可以发现区间内的极差>1的时候是不能办到这样的,只有整个区间内的极差<=1的时候,才能起到这种效果。所以我们就在线段树上再增加一些信息。就是最大值和最小值,最大值的个数,最小值的个数。这样的话,如果区间内的极差==1的时候,我们也能直接对整段进行操作。就能处理前面的这种样例了。”(感觉有点想特判…勿喷qaq);

    其实都到这份上,这道题目再讲下去对于自己的水平也没有意义了。。。
    这道题目的好:
    1.对于线段树区间元素的表示,以及完美地利用线段树的性质达到一种处理,都是非常棒的。
    2.这道题目的lazy操作也是很赞啊。query求sum以及更新操作的加都是一般可以解决,更新加操作需要一个lazy,然后标记某段区间是否相等,也要用到一个lazy。。对于lazy操作的写法,没写过很多很多题也是写不出来的。这题要想靠自己A掉,还要时间啊。先把基础搞好吧。
    暂时放弃。

  • 相关阅读:
    TestNG超时测试
    iOS平台如何进行app自动化测试?
    软件性能测试见解与总结
    性能测试关注点整理总结
    测试用例的设计步骤
    如何建立软件测试管理体系?
    关于手工测试,应该如何做?
    web性能测试流程
    SPASVO推出ALM(覆盖全生命周期的研发过程管理平台)免费在线体验平台
    如何使用testcenter统计开发工程师工作质量?
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934893.html
Copyright © 2011-2022 走看看