这道题需要支持区间修改和区间询问,因此采用线段树加以维护。

由于求的是开着的灯的数目,因此维护sum:区间[ l , r ]中开着的灯的数目。

tag取做0/1,表示区间是否反转,在进行标记下传时,如果tag=1,则下传,否则返回。(tag的选取一般跟操作有关)

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10; int n,m;
struct node{
#define lson t[k].lc
#define rson t[k].rc
int lc,rc,sum,tag;
}t[maxn<<1];
int tot=1; inline void pushup(int k){t[k].sum=t[lson].sum+t[rson].sum;}
inline void pushdown(int k,int l,int r){
int mid=l+r>>1;
if(t[k].tag==0)return;
t[lson].sum=mid-l+1-t[lson].sum,t[lson].tag^=1;
t[rson].sum=r-mid-t[rson].sum,t[rson].tag^=1;
t[k].tag=0;
} void build(int k,int l,int r){
if(l==r)return;
int mid=l+r>>1;
lson=++tot,build(lson,l,mid);
rson=++tot,build(rson,mid+1,r);
} void modify(int k,int l,int r,int x,int y){
if(l==x&&r==y){t[k].sum=r-l+1-t[k].sum,t[k].tag^=1;return;}
int mid=l+r>>1;
pushdown(k,l,r);
if(y<=mid)modify(lson,l,mid,x,y);
else if(x>mid)modify(rson,mid+1,r,x,y);
else modify(lson,l,mid,x,mid),modify(rson,mid+1,r,mid+1,y);
pushup(k);
} int query(int k,int l,int r,int x,int y){
if(l==x&&r==y)return t[k].sum;
int mid=l+r>>1;
pushdown(k,l,r);
if(y<=mid)return query(lson,l,mid,x,y);
else if(x>mid)return query(rson,mid+1,r,x,y);
else return query(lson,l,mid,x,mid)+query(rson,mid+1,r,mid+1,y);
} void read_and_parse(){
scanf("%d%d",&n,&m);
build(1,1,n);
} void solve(){
int opt,x,y;
while(m--){
scanf("%d%d%d",&opt,&x,&y);
if(opt==0)modify(1,1,n,x,y);
else printf("%d\n",query(1,1,n,x,y));
}
} int main(){
read_and_parse();
solve();
return 0;
}

【codevs1690】开关灯 线段树的更多相关文章

  1. codevs1690 开关灯(线段树)

    1690 开关灯 USACO  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description YYX家门前的街上有N(2< ...

  2. BZOJ 1230: [Usaco2008 Nov]lites 开关灯( 线段树 )

    线段树.. --------------------------------------------------------------------------------- #include< ...

  3. codevs 1690 开关灯 线段树+延迟标记

    1690 开关灯  时间限制: 1 s  空间限制: 128000 KB   题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这 ...

  4. codevs 1690 开关灯 线段树区间更新 区间查询Lazy

    题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的,六点之后,会有M(2<=m<=100000)个人 ...

  5. B1230 [Usaco2008 Nov]lites 开关灯 线段树

    就是线段树维护异或和.之前我线段树区间修改down都是修改当前区间,结果debug出不来,改成每次向下了. 题干: Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶 ...

  6. bzoj1230 开关灯 线段树

    好久没写线段树了..被一道线段树裸题卡了一个上午 对区间进行异或,查询的时候直接用区间长度减去原有是数量就是改变完的数量 #include<bits/stdc++.h> using nam ...

  7. BZOJ 1230 Usaco2008 Nov 开关灯 线段树

    思路: 用线段树模拟题中的操作就好 (标记异或 长度=区间总长度-当前已开灯的长度) //By SiriusRen #include <cstdio> using namespace st ...

  8. 【codevs1690】开关灯 线段树 区间修改+区间求和(标记)

    [codevs1690]开关灯 2014年2月15日4930 题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的 ...

  9. codevs 1690 开关灯 线段树水题

    没什么好说的,标记put表示开关是否开着. #include<cstdio> #include<cstring> #include<algorithm> using ...

随机推荐

  1. MySQL数据类型 约束

    一.数据库CDGS. 库 增   create database 库名; 删   drop 库名; 改 alter database 库名称 修改的属性名称; 查 show databases;#查看 ...

  2. [爬虫] selenium介绍

    认识selenium 在爬取百度文库的过程中,我们需要使用到一个工具selenium(浏览器自动测试框架),selenium是一个用于web应用程序测试的工具,它可以测试直接运行在浏览器中,就像我们平 ...

  3. 【Linux 网络编程】常用TCP/IP网络编程函数

    (1)函数socket /**************************************************************** ** 功能:创建一个套接字用于通信 ** 参 ...

  4. mysql 5.6 后热数据的加载

    mysql 5.6 后热数据的加载 转自:http://blog.itpub.net/20892230/viewspace-2127469/ 故障现象:在数据库重启后,碰巧遇到业务高峰期,连接数满,导 ...

  5. 跨 PostgreSQL 大版本复制怎么做?| 逻辑复制

    当需要升级PostgreSQL时,可以使用多种方法.为了避免应用程序停机,不是所有升级postgres的方法都适合,如果避免停机是必须的,那么可以考虑使用复制作为升级方法,并且根据方案,可以选择使用逻 ...

  6. 设计模式在 Spring 框架中的良好应用

    在开始正文之前,请你先思考几个问题: 你项目中有使用哪些 GOF 设计模式 说一说 GOF 23 种设计模式的设计理念 说说 Spring 框架中如何实现设计模式 假设我是面试官问起了你这些面试题,你 ...

  7. # Pycharm打造高效Python IDE

    Pycharm打造高效Python IDE 建议以scientific mode运行,在科学计算时,可以方便追踪变量变化,并且会提示函数的用法,比普通模式下的提示更加智能,一般在文件中引入了numpy ...

  8. python3.7环境下创建app,运行Django1.11版本项目报错SyntaxError: Generator expression must be parenthesized

    咳咳!!! 今天用命令行创建django项目中的app应用,出现了这样一个错误 这个错误在python3.6版本下安装运行django 1.11版本正常运行,但python3.7版本下运行django ...

  9. 一些通用的js工具类,添加自定义插件

    common_t.js /** * 通用工具组件 对原有的工具进行封装,自定义某方法统一处理<br> * ^_^ * * Author: em.D * Date: 2016-05-17 * ...

  10. Postman之获得登录的token,并设置为全局变量

    1.调通登录接口(可以参考上篇博客) 网址:Postman之简单使用 2.粘贴以下代码到Tests中 //把json字符串转化为对象 var data=JSON.parse(responseBody) ...