优化了好久好久..开始超时的程序在好多OJ交都过了,TOJ时间卡的太紧了。
开始有n个灯,标号为1~n。m个操作。
操作有更改某一段灯的状态(开变关,关变开)和查询某一段亮着的灯的个数 。
灯开始都是关着的。
我开始很纠结,怎么更改一段的灯的状态呢?有的是开,有的是关,那不是要更新到叶子结点了?
想了两天终于想通其实不需要记录灯的状态,只需要知道一个区间被改过多少次就行了。
一个区间的亮灯数是sum,区间里一共有灯L个。那这个区间被改之后亮灯数就变成了L - sum。
而且如果一个区间被改了偶数次,和没改一样;被改奇数次和改了一次一样。
那就很简单了,只要到了被范围完全覆盖的区间,就改那个区间的sum和info(记录更改次数的奇偶)然后直接返回。只要经过info记录为奇数次的区间就更新它的子区间。查询时只要直接查询区间的sum就行了 。
Show Code - Run ID 952408
Submit Time: 2010-08-06 18:22:37 Language: GNU C Result: Accepted
Pid: 3148 Time: 0.84 sec. Memory: 5360 K. Code Length: 1.8 K.