[TOJ] 3148 Light Switching -- 线段树

来源:互联网 发布:达内 西安java培训 编辑:程序博客网 时间:2024/05/20 09:45

优化了好久好久..开始超时的程序在好多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.


 

原创粉丝点击