BUPT 201 Glorious Array

北邮邀请赛的题目,比赛的时候思路很乱,现在整理下吧。网上已经给出了有公式解法,我这里还是说说树状数组的解法吧


题目只有两个操作,一个是将一个点的颜色取反,一个是询问有多少个端点颜色不同并且包含小于k的区间。


总体思路是这样

首先是用树状数组保存每个点的颜色,如果是1,那个点加1,这是初始化的事情。

接着用树状数组的求和,可以得到一个区间黑点的个数,用总数减去这个,可以得到白点的个数。


刚开始的时候,对于最早的序列情况,求出刚开始的满足要求的序列总和。

可以从1到n枚举,对于i这个点,计算出以i这个点为起始点的序列和,具体算法是n-所有与i点颜色相同的点个数-所有不是以i为起点的相异颜色的个数

这里需要两个数组,一个l数组,一个r数组,l[i],r[i]分别表示第i个点的左边最近一个点(若颜色相异)可以以i点为末尾点构造一个合法区间,第i个点右边最近一个点(若颜色相异)可以以i为起点构造一个合法区间

说的有点不是很清楚。。。意识。。。。


找出初始的和以后,每改变一个点,就要减去(颜色不变前)所有左边合法的相异点的和,和自身的和

接着再加上(改变颜色后)左边所有合法的相异点的和,和自身的的和

再维护树状数组




你可能感兴趣的:(BUPT 201 Glorious Array)