codevs1690 开关灯
YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的,六点之后,会有M(2<=m<=100000)个人陆续按下开关,这些开关可以改变从第i盏灯到第j盏灯的状态,现在YYX想知道,从第x盏灯到第y盏灯中有多少是亮着的(1<=i,j,x,y<=N)
第 1..询问总次数 行:对于每一次询问,输出询问的结果
4 5
0 1 2
0 2 4
1 2 3
0 2 4
1 1 4
2
一共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 开关灯的更多相关文章
- codevs1690 开关灯(线段树)
1690 开关灯 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description YYX家门前的街上有N(2< ...
- codevs1690开关灯
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #def ...
- 【codevs1690】开关灯 线段树 区间修改+区间求和(标记)
[codevs1690]开关灯 2014年2月15日4930 题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的 ...
- 【codevs1690】开关灯 (线段树 区间修改+区间求和 (标记))
[codevs1690]开关灯 2014年2月15日4930 题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的 ...
- 【codevs1690】开关灯 线段树
这道题需要支持区间修改和区间询问,因此采用线段树加以维护. 由于求的是开着的灯的数目,因此维护sum:区间[ l , r ]中开着的灯的数目. tag取做0/1,表示区间是否反转,在进行标记下传时,如 ...
- Code[VS]1690 开关灯 题解
Code[VS]1690 开关灯 题解 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description: YYX家门前 ...
- ckplayer播放器去掉右边的开关灯分享插件
在上一篇文章中介绍了如何使用ckplayer播放器,但是有的人不需要CK播放器右边的开关灯分享插件,那么就需要把该插件给去掉,方法也很简单. 第一步:先打开ckplayer.js里找到下面三行删除掉 ...
- 【wikioi】1690 开关灯(线段树)
http://wikioi.com/problem/1690/ 这题可不能算是水题了.. 在线段树中,我只想到了lazy改变,但是没想到lazy变后size怎么变,我的策略变成了lazy为0时size ...
- Codevs 1690 开关灯 USACO
1690 开关灯 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description YYX家门前的街上有N(2<=N& ...
随机推荐
- java编程基础——二叉树的镜像
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 题目代码 /** * @program: JavaCode * @description: 操作给定的二叉树,将其变换为源二叉树的镜像. * 二 ...
- 使用 Repeater方式和完全静态页面使用AJAX读取和提交数据
1.使用Repeater方式: Comments.aspx <html xmlns="http://www.w3.org/1999/xhtml"> <head r ...
- react 信用卡格式检验
前言: 技术栈主要基于react + ant-design 描述: 填写信用卡卡号时,会自动四位空格,并格式校验判断卡种 ,这里我们业务只涉及到四种卡. 代码解析 // ant 组件自引,这里我只讲 ...
- 第四篇、Swift_Podfile文件配置格式
# Uncomment this line to define a global platform for your project platform :ios, '9.0' # Comment th ...
- Python 一行代码输出心形图案
Python3 >>> print('\n'.join([''.join([('Love'[(x-y)%4]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0. ...
- wepy一些问题和解决方案
wepy一些问题和解决方案 小程序开发和传统的web开发有相识的地方,但是也有不同的地方,要区分. computed属性名和props属性名重复 如果那个组件的渲染值是重名的computed属性,每次 ...
- 1046: [HAOI2007]上升序列
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5822 Solved: 2071[Submit][Status][Discuss] Descript ...
- 【PHP】PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
php编程中有时候会需要用上排序,在这里简单地整理一下集中sort的区别,方便查询 sort() 函数用于对数组单元从低到高进行排序. rsort() 函数用于对数组单元从高到低进行排序. asort ...
- JAVA连接数据库,并写入到txt文件
package Hello; import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;impor ...
- 初识Java之入门学习(扫盲)
一,开发环境的配置 1. jdk1.8的安装 2. 环境变量的配置 3.MyEclipse8.5的安装 jdk是什么: JDK 是Java开发工具包 (Java Development Kit ) 的 ...