北邮邀请赛的题目,比赛的时候思路很乱,现在整理下吧。网上已经给出了有公式解法,我这里还是说说树状数组的解法吧
题目只有两个操作,一个是将一个点的颜色取反,一个是询问有多少个端点颜色不同并且包含小于k的区间。
总体思路是这样
首先是用树状数组保存每个点的颜色,如果是1,那个点加1,这是初始化的事情。
接着用树状数组的求和,可以得到一个区间黑点的个数,用总数减去这个,可以得到白点的个数。
刚开始的时候,对于最早的序列情况,求出刚开始的满足要求的序列总和。
可以从1到n枚举,对于i这个点,计算出以i这个点为起始点的序列和,具体算法是n-所有与i点颜色相同的点个数-所有不是以i为起点的相异颜色的个数
这里需要两个数组,一个l数组,一个r数组,l[i],r[i]分别表示第i个点的左边最近一个点(若颜色相异)可以以i点为末尾点构造一个合法区间,第i个点右边最近一个点(若颜色相异)可以以i为起点构造一个合法区间
说的有点不是很清楚。。。意识。。。。
找出初始的和以后,每改变一个点,就要减去(颜色不变前)所有左边合法的相异点的和,和自身的和
接着再加上(改变颜色后)左边所有合法的相异点的和,和自身的的和
再维护树状数组