zoukankan      html  css  js  c++  java
  • 影魔

    个人认为是day1最难的一道题。

    用单调栈/链表找到一个元素i往左/右的第一个大于它的数,设为l[i],r[i]

    题目要枚举区间不好做,改为枚举中间的最大值。设位置为i。

    实际上,如果一个区间的左/右端点都在([l[i]+1,i-1]/[i+1,r[i]-1])内,那么根据题意无法对答案产生贡献。

    如果一个区间的左/右端点恰有1个在([l[i]+1,i-1]/[i+1,r[i]-1])内,会对答案产生p2的贡献。设为1/2类贡献。

    如果一个区间的左/右端点为l[i]/r[i],会对答案产生p1的贡献。设为3类贡献。

    p1贡献直接使用二维数点即可。现在要考虑p2贡献。

    对于1/2类贡献,把所有询问按照l[i]/r[i]一起排序。询问排序的关键字设为x

    实际上,p2的贡献贡献的是一个区间。

    把每个询问拆成两个前缀相减。

    在遇到修改操作时,在对应的区间+p2,每次查询的时候对于询问查询区间即可。

    这样子是正确的,是因为当一个询问在l-1处未被插入,但是在r处被插入,当前询问的区间会包含贡献。

    当一个询问在l-1/r处被/未被插入,则当前询问的区间未包含贡献。

  • 相关阅读:
    调试跳转动态打印
    PHP对redis操作详解
    SSL证书没有绿锁您与此网站建立的连接并非完全安全解决办法
    63. Unique Paths II
    62. Unique Paths
    40. Combination Sum II
    60. Permutation Sequence
    59. Spiral Matrix II
    批量修改名字的脚本
    57. Insert Interval
  • 原文地址:https://www.cnblogs.com/cszmc2004/p/12967253.html
Copyright © 2011-2022 走看看