[省选] [线段树] [差分数组] [BZOJ1558] [JSOI2009] 等差数列

来源:互联网 发布:加内特2004季后赛数据 编辑:程序博客网 时间:2024/06/06 13:10

题目传送门。
因为一道脑洞题写的这个……
等差数列公差相等,果断维护差分数组,但是差分数组会比原数组少一个元素,这里需要注意。
这里维护di=aiai1     i[2,n]iN
修改相当于两个点修改和一个段修改。对于[l,r]的修改,需要的修改为:
dl>dl+adr+1>dr+1(a+b(rl))di>di+b    i[l+1,r]
那么如何获得答案?
请允许我说之前写的都很……嗯……扯淡……
具体问题是:两个数也可以构成等差数列,所以两个相邻不同颜色可以合并以减少答案……或者第一个数自己就可以构成一个长度为2的等差数列……
看了FallDream的博客后才明白一些……
用一个二进制数aral(2)表示一个区间[l,r]的左右端点选择或不选择合并到上一层答案的状态。如果某一端没有被选,则它是由下一层的中间合并的,才使它没被选(变成了一个单独的数),因此如果有两个区间需要合并,那么左区间的右端和右区间的左端不能同时不选。
然后,按情况合并即可……注意如果左区间右端和右区间左端同时被选且两端数相同,则应减去1
答案应该使得左右端点都包含……
时间复杂度O((n+Q)log2n)
Code

1 0
原创粉丝点击