挺妙的,学到了(
考虑离线处理询问,把询问按右端点排序。考虑从左往右加入数,同时计算每个数对所有区间的贡献。
设当前正在加入第 i 个数 ai,则 ai 只会影响左端点在 ai 上一次出现的位置之后的区间。
则取出值域在 [ai−11,ai+11] 的每个在 i 之前最后出现的数(每种权值找一个),显然只有这些数是可能产生或减少贡献的。
至于为什么要 ±11 呢,是因为要求的是极长,故要考虑删除贡献。
把这些数按照位置从大到小排好序,然后扫过去,计算以 ai−1 为结尾和 ai+1 为开头的最长值域连续段的长度。
这样的话把这两个接起来便可得到新的连续段,同时删去这两段单独的贡献即可。
学了学 memset0 的代码。
题目略卡常。
代码:
1 |
|