【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 ...
随机推荐
- 【Qt开发】QT对话框去掉帮助和关闭按钮 拦截QT关闭窗口的CloseEvent
建了一个对话框,我不想把边框去掉,只想去掉关闭按钮, setWindowFlags(windowFlags()&~Qt::WindowCloseButtonHint&~Qt::Wind ...
- 让mysql的id字段变成表的主键
1.#已经加主键 desc szdj.sys_message_user;alter table sys_message_user add constraint pk_mess_user primary ...
- Minimum Score Triangulation of Polygon
Given N, consider a convex N-sided polygon with vertices labelled A[0], A[i], ..., A[N-1] in clockwi ...
- Java白皮书学习笔记+Head First Java--用于自我复习 基础知识篇
本笔记是摘与Hava白皮书上面的内容,用来给自己做提醒的,因此大概并不适合Java的学习者作为笔记参考使用. 以我的水平现在还看不懂这个... 一.基础知识篇 1.常量 final关键字指示常量,只能 ...
- const和static const的区别(未整理)
对于C/C++语言来讲,const就是只读的意思,只在声明中使用;static一般有2个作用,规定作用域和存储方式.对于局部变量,static规定其为静态存储方式,每次调用的初始值为上一次调用的值,调 ...
- Java Web开发技术教程入门-JavaBean组件与Servlet
补更:阅战阅勇第7/8/9Days笔记 昨天我们了解了JDBC技术的一些日常操作,对于数据库而言,不仅仅的只有"增,删,改,查".博主觉得最重要的是SQL语句的优化,一个" ...
- 福建工程学院第十四届ACM校赛B题题解
第二集,未来的我发量这么捉急的吗 题意: 有n个数,请问有多少对数字(i,j)(1<=i<j<=n),满足(a[i]^a[j])+((a[i]&a[j])<<1) ...
- Echarts ajax异步
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Charles学习(二)之使用Map local代理本地静态资源以及配置网页代理在Mac浏览器上调试移动端
前言 我们在开发的过程肯定是一边写代码,一边查看自己的代码写的是否存在问题,那么问题来了,有两种情况 情况一:我们可以本地起服务,那么我们就可以在本地检查自己的代码,查看运行结果 情况二:本地无法起服 ...
- leetcode 1267. Count Servers that Communicate
You are given a map of a server center, represented as a m * n integer matrix grid, where 1 means th ...