zoukankan      html  css  js  c++  java
  • CF193D

    讲个笑话:tzc 告诉我 hb 给他们讲了 193B(*2000),我看成了 193D(*2900),然后还真自己做出来了(


    首先有一个平方(或者带 log)级别的暴力:枚举组成的等差数列的左右端点,然后判是否可行。很有优化前途。

    我们考虑一个套路的扫描线:枚举右端点,维护关于左端点的可行性序列。

    考虑一对左右端点可行的充要条件。显然有,当且仅当它们组成 (leq 2) 个区间(连通块)。于是我们考虑维护关于左端点的连通块数量序列。考虑新加进一个 (r) 会让 (l) 们对应的连通块数量获得哪些变化。

    这个其实不难。先考虑把 (r) 令为一个单独的连通块整体 (+1)。然后考虑合并,显然对左边和右边能合并当且仅当它被 ([l,r-1]) 包含。那么合并 (0,1,2) 显然分别是区间。

    那么问题就转化为了区间 (pm 1),区间数 (1,2)。这个东西我见过不止一遍了(最初的思路来自 rng,然而现在他 goodbye 了),所以秒掉了:考虑线段树的每个节点维护最小值、最小值出现次数、次小值、次小值出现次数,那么显然可上传可懒标记。查询的时候,由于如果有 (1,2) 的话那么它们必定是最小值或者次小值,直接查就可以了。

    所以说 *2900 应该是因为远古场的原因。但是有个细节:合并的时候有可能出现左儿子的次小值小于右儿子的最小值,分类讨论出错了,可以直接放进数组大力 sort。调死爷辣!

    code

  • 相关阅读:
    【leetcode_easy】589. N-ary Tree Preorder Traversal
    【linux基础】Ubuntu下的终端多标签切换快捷键
    车道线检测github集锦
    [c++]struct timeval
    [opencv] copyTo函数的使用方法
    [c++]C++关键字之friend
    【动手学深度学习】Jupyter notebook中 import mxnet出错
    【opencv】split
    【leetcode_easy】581. Shortest Unsorted Continuous Subarray
    第1课 学习Lua的意义
  • 原文地址:https://www.cnblogs.com/ycx-akioi/p/solution-cf193d.html
Copyright © 2011-2022 走看看