题意:
长度为n的数列A,m次询问,每次给出一个区间,求区间内不同数字的种数。
还有一堆恶心的限制。
1.强制在线(暴力优化神器莫队直接被ban)
2.内存8M (并不是特别暴力的主席树和线段树被疯狂针对)
3.1s,上述所有数字都是1e5级别的(暗示考点:卡常数(底层优化))。
part1:
卡内存怎么办?
tsy大佬说过,当线段树被卡内存时就要分块。
tsy大佬还说过,分块这么简单,不就是个优化的暴力吗?
part2:
分块怎么统计不同数字啊?
每个块开数组存有那些数字啊!
这不会TLE + MLE(2000000的int就MLE了)吗?
废话这当然会TLE+MLE。
接下来有请bitset出场,它给我们的空间及时间常数因子上除了个w
现在我们时间复杂度为O(n*sqrt(n)*n/w),空间复杂度为O(n*sqrt(n)/w)
现在总算不MLE了,好像还有点充裕。
bitset属于底层优化,最有效的一种暴力优化.
part3:
TLE怎么破?(加不加bitset一个分,心疼自己一波)
可以发现分块时段在合并时总复杂度为O(sqrt(n)*n/w)而段外的暴力复杂度仅为O(sqrt(n))
考虑优化段合并.这能优化吗?
当然能,存一下每两个段之间的的部分的数字种类(用bitset),就变成O(n/w)辣。(思路超暴力)
这不会MLE吗?
废话这当然会MLE。
part4:
看一下我们之前的空间复杂度,为O(n*n/w)
下面来一种高级的暴力优化,O(1)RMQ
我们把每两个段改为(i与i+2^j)
空间复杂度O(n*log n / w)
RMQ怎么求数字种类?
或起来不就行了吗。(当维护的值可以不用去重比如说求max,min,或时可以O(1)RMQ,真是太套路了)
时间复杂度 O(n*n/w+n*sqrt(n))
n=100000,w=32
这,300000000过1s?(写8个0以悼念出题人)
part5:
答 : 谁和你说w=32了。
问 :难道bitset不是32位的吗?
答 :难道像我这样优(du)秀(liu)的出题人会用STL?自己用long long写。
问 : 。。。。。。可是作为一名优(du)秀(liu)的出题人你需要开3倍时限啊,你的标程1.5亿跑0.3s?
答 : 我把只出现一次的数字挑出来特殊处理,剩下的数字只有50000种,0.2s随便过。
。。。。。。
送出题人一句话:如果暴力不是为了杀戮,那将毫无意义。