[TOJ] 3148 Light Switching -- 线段树

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




 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值