【codevs1690】开关灯 线段树
这道题需要支持区间修改和区间询问,因此采用线段树加以维护。
由于求的是开着的灯的数目,因此维护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】开关灯 线段树的更多相关文章
- codevs1690 开关灯(线段树)
1690 开关灯 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description YYX家门前的街上有N(2< ...
- BZOJ 1230: [Usaco2008 Nov]lites 开关灯( 线段树 )
线段树.. --------------------------------------------------------------------------------- #include< ...
- codevs 1690 开关灯 线段树+延迟标记
1690 开关灯 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这 ...
- codevs 1690 开关灯 线段树区间更新 区间查询Lazy
题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的,六点之后,会有M(2<=m<=100000)个人 ...
- B1230 [Usaco2008 Nov]lites 开关灯 线段树
就是线段树维护异或和.之前我线段树区间修改down都是修改当前区间,结果debug出不来,改成每次向下了. 题干: Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶 ...
- bzoj1230 开关灯 线段树
好久没写线段树了..被一道线段树裸题卡了一个上午 对区间进行异或,查询的时候直接用区间长度减去原有是数量就是改变完的数量 #include<bits/stdc++.h> using nam ...
- BZOJ 1230 Usaco2008 Nov 开关灯 线段树
思路: 用线段树模拟题中的操作就好 (标记异或 长度=区间总长度-当前已开灯的长度) //By SiriusRen #include <cstdio> using namespace st ...
- 【codevs1690】开关灯 线段树 区间修改+区间求和(标记)
[codevs1690]开关灯 2014年2月15日4930 题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的 ...
- codevs 1690 开关灯 线段树水题
没什么好说的,标记put表示开关是否开着. #include<cstdio> #include<cstring> #include<algorithm> using ...
随机推荐
- MySQL数据类型 约束
一.数据库CDGS. 库 增 create database 库名; 删 drop 库名; 改 alter database 库名称 修改的属性名称; 查 show databases;#查看 ...
- [爬虫] selenium介绍
认识selenium 在爬取百度文库的过程中,我们需要使用到一个工具selenium(浏览器自动测试框架),selenium是一个用于web应用程序测试的工具,它可以测试直接运行在浏览器中,就像我们平 ...
- 【Linux 网络编程】常用TCP/IP网络编程函数
(1)函数socket /**************************************************************** ** 功能:创建一个套接字用于通信 ** 参 ...
- mysql 5.6 后热数据的加载
mysql 5.6 后热数据的加载 转自:http://blog.itpub.net/20892230/viewspace-2127469/ 故障现象:在数据库重启后,碰巧遇到业务高峰期,连接数满,导 ...
- 跨 PostgreSQL 大版本复制怎么做?| 逻辑复制
当需要升级PostgreSQL时,可以使用多种方法.为了避免应用程序停机,不是所有升级postgres的方法都适合,如果避免停机是必须的,那么可以考虑使用复制作为升级方法,并且根据方案,可以选择使用逻 ...
- 设计模式在 Spring 框架中的良好应用
在开始正文之前,请你先思考几个问题: 你项目中有使用哪些 GOF 设计模式 说一说 GOF 23 种设计模式的设计理念 说说 Spring 框架中如何实现设计模式 假设我是面试官问起了你这些面试题,你 ...
- # Pycharm打造高效Python IDE
Pycharm打造高效Python IDE 建议以scientific mode运行,在科学计算时,可以方便追踪变量变化,并且会提示函数的用法,比普通模式下的提示更加智能,一般在文件中引入了numpy ...
- python3.7环境下创建app,运行Django1.11版本项目报错SyntaxError: Generator expression must be parenthesized
咳咳!!! 今天用命令行创建django项目中的app应用,出现了这样一个错误 这个错误在python3.6版本下安装运行django 1.11版本正常运行,但python3.7版本下运行django ...
- 一些通用的js工具类,添加自定义插件
common_t.js /** * 通用工具组件 对原有的工具进行封装,自定义某方法统一处理<br> * ^_^ * * Author: em.D * Date: 2016-05-17 * ...
- Postman之获得登录的token,并设置为全局变量
1.调通登录接口(可以参考上篇博客) 网址:Postman之简单使用 2.粘贴以下代码到Tests中 //把json字符串转化为对象 var data=JSON.parse(responseBody) ...