【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此题

代码

原文地址:https://www.cnblogs.com/lstoi/p/9877158.html