洛谷P3246 序列 [HNOI2016] 莫队/线段树+扫描线 影魔

正解:莫队/线段树+扫描线

解题报告:

传送门!

似乎是有两种方法的,,,所以分别港下好了QAQ

第一种,莫队

看到这种询问很多区间之类的就会自然而然地想到莫队趴?然后仔细思考一下,发现复杂度似乎是欧克的,而且好像也是能做的,那就试着做下呗

首先考虑到怎么从[l,r]转移到[l,r+1],可以想到这个之间的增量=就是区间内最小值之和,于是用个st表搞rmq就好,这里具体港下QwQ

首先如果已经求出来了[l,r]内部的最小值的位置pos,这里不过多阐述了rmq就成了

那么分情况讨论下咯

如果a[r+1]<a[pos],那就是贡献a[r+1]*(r-l+1),不说

否则就要继续讨论

显然[l,pos]的贡献就都出来了嘛,a[pos]*(pos-l+1)

然后考虑怎么求[pos+1,r]的贡献呢QAQ?

可以考虑开俩数组lst[i]表示第i个数的左边第一个比它小的数,可以先单调栈求出来

再设sum[i]表示第1个数到第i个数的贡献

显然可以得到sum[i]=sum[lst[i]]+a[i]*(i-lst[i])

然后就可以得到总贡献=a[pos]*(pos-l+1)+sum[r+1]-sum[pos]

然后不就是莫队板子了嘛,不说了

等下放代码QAQ

第二种,线段树+扫描线

听说和影魔有点儿类似,,,?

然而我太菜了所以想不出来QAQ

所以等想到了再写QAQ反正我先去把法一代码了QAQ

然后再设

 

猜你喜欢

转载自www.cnblogs.com/lqsukida/p/10426856.html