【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 ...
随机推荐
- JavaScript基础入门09
目录 JavaScript 基础入门09 Event 自定义右键菜单 获取鼠标按键 获取鼠标坐标 获取键盘按键 页面中位置的获取 浏览器的默认行为 冒泡 什么是冒泡 小练习 JavaScript 基础 ...
- etcd 使用: golang 例子
一:连接到 etcd package main import ( "fmt" "go.etcd.io/etcd/clientv3" "time&quo ...
- office web apps安装部署,配置https,负载均衡(三)服务器连接域控制器
前提条件:1>一台window server 2008R2 服务器 2>您已经在同一内网的另外一台服务器上安装好了域控制器文档请看我写的另外一篇文章: office web apps安装部 ...
- python-https状态码
HTTP状态码状态码的职责是当客户端向服务器发送请求时,描述返回的请求结果.借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误. 状态码的类别 >>>状态码 类别 说明 ...
- HTTP 请求中的 Form Data 与 Request Payload 的区别
HTTP 请求中的 Form Data 与 Request Payload 的区别 前端开发中经常会用到 AJAX 发送异步请求,对于 POST 类型的请求会附带请求数据.而常用的两种传参方式为:Fo ...
- PJzhang:我发现一个有两个答案的数独题
猫宁!!! 最近做数独题,发现了一个答案不唯一的数独,之前对此类数独有所耳闻,但是没有亲手发现,碰巧发现一个,很是欣喜. 下面展示了两个答案 第一个 第二个 绿色标签是答案 ...
- 简洁易懂说VLAN
简洁易懂说VLAN 1. VLAN概述 虚拟局域网(Virtual Local Area Network,VLAN),VLAN最主要的作用是分割局域网中广播域.传统交换机组成的LAN中,往往包含了成千 ...
- java中start()、yield、setDeamon()
本节主要说明以下三个问题 start()的启动顺序不代表线程的启动顺序 yeild的作用 守护线程 1.start()与线程启动顺序 package foreverly.cn.chapter1; pu ...
- Unity VR-播放demo模型后无法移动视角
资源源于:小意思VR 唉..可怜一下自己,这个问题百度google也不知道怎么搜,没搜出来,在群里问出来的. 当时感觉自己Unity有问题..(就是因为自己啥也不会看不懂) 按右键.或者WASD视角都 ...
- codeforces 842C Ilya And The Tree (01背包+dfs)
(点击此处查看原题) 题目分析 题意:在一个树中,有n个结点,记为 1~n ,其中根结点编号为1,每个结点都有一个值val[i],问从根结点到各个结点的路径中所有结点的值的gcd(最大公约数)最大是多 ...