1690 开关灯

USACO

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
 
 
 
题目描述 Description

YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的,六点之后,会有M(2<=m<=100000)个人陆续按下开关,这些开关可以改变从第i盏灯到第j盏灯的状态,现在YYX想知道,从第x盏灯到第y盏灯中有多少是亮着的(1<=i,j,x,y<=N)

输入描述 Input Description
第 1 行: 用空格隔开的两个整数N和M
第 2..M+1 行: 每行表示一个操作, 有三个用空格分开的整数: 指令号(0代表按下开关,1代表询问状态), x 和 y 
输出描述 Output Description

第 1..询问总次数 行:对于每一次询问,输出询问的结果

样例输入 Sample Input

4 5
0 1 2
0 2 4
1 2 3
0 2 4
1 1 4

样例输出 Sample Output
1
2
 
数据范围及提示 Data Size & Hint

一共4盏灯,5个操作,下面是每次操作的状态(X代表关上的,O代表开着的):

XXXX -> OOXX -> OXOO -> 询问1~3 -> OOXX -> 询问1~4

分析:其实是一道比较简单的线段树的题目。我们只需要记录关着的灯的数量和开着的灯的数量,操作时交换即可,涉及到区间操作,需要用到lazy标记,其实如果一个区间操作两次,那么相当于不操作,所以当一个区间的lazy标记为奇数时才往下传.

/*
作者:zbtrs
题目:p1690 开关灯
*/
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <cmath> using namespace std; int n, m,d1[],add[],d2[]; void pushup(int o)
{
d1[o] = d1[o * ] + d1[o * + ]; //关
d2[o] = d2[o * ] + d2[o * + ]; //开
} void pushdown(int o, int l, int r)
{
if (add[o] % == )
{
add[o * ] += add[o];
add[o * + ] += add[o];
add[o] = ;
swap(d1[o * ], d2[o * ]);
swap(d1[o * + ], d2[o * + ]);
}
} void build(int o, int l, int r)
{
if (l == r)
{
d1[o] = r - l + ;
return;
}
int mid = (l + r) >> ;
build(o * , l, mid);
build(o * + , mid + , r);
pushup(o);
} void update(int o, int l, int r, int x, int y)
{
if (x <= l && r <= y)
{
swap(d1[o], d2[o]);
add[o]++;
return;
}
pushdown(o, l, r);
int mid = (l + r) >> ;
if (x <= mid)
update(o * , l, mid, x, y);
if (y > mid)
update(o * + , mid + , r, x, y);
pushup(o);
} int query(int o, int l, int r, int x, int y)
{
if (x <= l && r <= y)
return d2[o];
pushdown(o, l, r);
int mid = (l + r) >> ,cnt = ;
if (x <= mid)
cnt += query(o * , l, mid, x, y);
if (y > mid)
cnt += query(o * + , mid + , r, x, y);
pushup(o);
return cnt;
} int main()
{
scanf("%d%d", &n, &m);
build(, , n);
for (int i = ; i <= m; i++)
{
int id, x, y;
scanf("%d%d%d", &id, &x, &y);
if (id == )
update(, , n, x, y);
if (id == )
printf("%d\n", query(, , n, x, y));
} return ;
}

codevs1690 开关灯的更多相关文章

  1. codevs1690 开关灯(线段树)

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

  2. codevs1690开关灯

    #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #def ...

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

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

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

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

  5. 【codevs1690】开关灯 线段树

    这道题需要支持区间修改和区间询问,因此采用线段树加以维护. 由于求的是开着的灯的数目,因此维护sum:区间[ l , r ]中开着的灯的数目. tag取做0/1,表示区间是否反转,在进行标记下传时,如 ...

  6. Code[VS]1690 开关灯 题解

    Code[VS]1690 开关灯 题解     时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description:     YYX家门前 ...

  7. ckplayer播放器去掉右边的开关灯分享插件

    在上一篇文章中介绍了如何使用ckplayer播放器,但是有的人不需要CK播放器右边的开关灯分享插件,那么就需要把该插件给去掉,方法也很简单. 第一步:先打开ckplayer.js里找到下面三行删除掉 ...

  8. 【wikioi】1690 开关灯(线段树)

    http://wikioi.com/problem/1690/ 这题可不能算是水题了.. 在线段树中,我只想到了lazy改变,但是没想到lazy变后size怎么变,我的策略变成了lazy为0时size ...

  9. Codevs 1690 开关灯 USACO

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

随机推荐

  1. CUDA并行存储模型

    CUDA将CPU作为主机(Host),GPU作为设备(Device).一个系统中可以有一个主机和多个设备.CPU负责逻辑性强的事务处理和串行计算,GPU专注于执行高度线程化的并行处理任务.它们拥有相互 ...

  2. React后台管理系统-登录页面

    登录页面 <div className="col-md-4 col-md-offset-4">                <div className=&qu ...

  3. struts+hibernate+spring整合过程常见问题收集

    1.java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor缺少asm-3.3.jar2.java.lang.NoClassDefF ...

  4. MySQL数据库的下载安装

    目录 一.概述 二.MySQL安装 三.安装成功验证 四.NavicatforMySQL下载及使用 一.MySQL下载 MySQL版本:5.7.17 下载地址:https://dev.mysql.co ...

  5. Nginx读书笔记

    ... upstream proxy_svrs { server http://192.168.1.1:8001/uri/; server http://192.168.1.2:8001/uri/; ...

  6. 【Ecshop】将内置的 FCkeditor 更换为 UEditor

    1.下载UE,解压到includes/,更名目录名为ueditor 注意更改配置后端文件上传路径,参考文档 2.修改admin/includes/lib_main.php,添加 /** * 生成编辑器 ...

  7. (转)iOS 对矢量图片的支持如何?

    简单说,iOS 支持矢量图片,不过支持的一般.在系统层面上,iOS 对矢量绘图支持得很好.iOS 的 Core Graphics 框架带有很多矢量绘图命令,简单一些的直线.矩形.椭圆,复杂一些的贝赛尔 ...

  8. php扩展开发-实现一个简易的哈希表

    从一个简易的哈希表入手,会让你更好的理解php的哈希表,他们的本质是一样的,只是php的哈希表做了更多的功能扩展,php的哈希表是php语言的一个重要核心,大量的内核代码使用到哈希表. #includ ...

  9. python3 练习题100例 (十二)

    题目十二:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数",因为153 ...

  10. oracle 事务 锁机制

    原文地址:http://www.cnblogs.com/quanweiru/archive/2013/05/24/3097367.html 本课内容属于Oracle高级课程范畴,内容略微偏向理论性,但 ...