• 【20181030T2】字胡串【分治+双指针】


    题面

    【正解】

    一眼分治

    (O(N^2))有50分,先敲了

    等下,由于最大的数或进去了,所以有(g(T) geq f(T))

    也就是说,我们用(n imes (n-1) /2)算出总数,再减去(g(T) = f(T))的就可以了

    我们套路地分治,每次统计左端点在左半边,右端点在右半边的种数

    (f(i))表示当前点到中间分割点的最大值,(g(i))表示当前点到中间分割点的或和

    然后两边分开统计

    发现(f)往两边是单调的,(g)不仅是单调的,靠内的还一定是靠外的的子集

    每次for一遍,另一边可以二分,这样是(O(Nlog_N^2))的……80就80吧

    然后答案少了很多

    发现两边很多重复的,就把右边的删了

    过样例了

    然后大样例死循了

    debug一下,发现二分边界很多,各种特判,最后乱得不成样子

    突然意识到“没根据的乱搞不可能是正解”,毅然决定把它删了

    然后换了种二分,每次记录ans

    嗯过了

    哎大样例怎么多了5?

    等下,好像可以双指针?

    for的时候因为(g(i))是不断或进去的,那右边就是单调往右的

    没毛病,这样(O(NlogN))了……完美

    把二分删了

    五六行写完,过了小样例

    ……怎么还是多5

    仔细检查了一下,没问题啊

    对拍对拍

    把之前写的50分挪出来,写了个(N=10)(a le 31)的generator,run

    ……第一个就挂了

    debug一下,发现在查左边时右边有个31把它挡住了,而右边的31又没有统计到

    但两边都跑有重复啊……

    哎不对,必须要保证正在枚举的是最大的

    那判下大小?

    小样例过了

    第二个4个3的,6

    ……好像要小于等于

    然后成了-6

    ……好像是一个小于一个小于等于

    过了小样例

    哇大样例对了

    继续对拍,没问题

    改成N=3000,没挂

    然后AC此题

    代码

  • 相关阅读:
    react native( rn) 中关于navigationOptions中headerRight 获取navigation的问题 rn
    string与number转换
    基础面试资料
    vim快捷键大全
    Vim中的自定义快捷键
    去掉ubuntu命令行模式提示声
    模板非类型形参的详细阐述
    C++中为什么构造函数不能定义为虚函数
    C++ 深入理解 虚继承、多重继承和直接继承
    C++ 虚函数表解析
  • 原文地址:https://www.cnblogs.com/lstoi/p/9877158.html
Copyright © 2020-2023  润新知