先来一发题目:

1690 开关灯

时间限制: 1 s

空间限制: 128000 KB

题目描述 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

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 100000+10
struct node
{
int l,r;
int val;
int d;
}a[*N];
int n,m,p,x,y; void update(int );
void buildtree(int,int,int);
void down(int);
void add(int,int,int,int,int);
int query(int ,int,int,int,int); int main()
{
scanf("%d%d",&n,&m);
buildtree(,,n);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&p,&x,&y);
if(p==)
{
add(,,n,x,y);
}
else printf("%d\n",query(,,n,x,y));
}
return ;
}
void update(int k)
{
int lch=k*,rch=(k*)+;
a[k].val=a[lch].val+a[rch].val;
}
void buildtree(int k,int l,int r)
{
a[k].l=l;a[k].r=r;
if(l==r)
{
a[k].val=a[k].d=;
return ;
}
int mid=(l+r)/,lch=k*,rch=(k*)+;
buildtree(lch,l,mid);
buildtree(rch,mid+,r);
update(k);
}
void down(int k)
{
int lch=k*,rch=(k*)+;
a[lch].d+=a[k].d;
a[lch].d%=;
a[lch].val=(a[lch].r-a[lch].l+)-a[lch].val;
a[rch].d+=a[k].d;
a[rch].d%=;
a[rch].val=(a[rch].r-a[rch].l+)-a[rch].val;
a[k].d=;
}
void add(int k,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
{
a[k].d++;
a[k].d%=;
a[k].val=(r-l+)-a[k].val;
return;
}
if(a[k].d)
down(k);
int mid=(l+r)/,lch=k*,rch=(k*)+;
if(x<=mid)
add(lch,l,mid,x,y);
if(y>mid)
add(rch,mid+,r,x,y);
update(k);
}
int query(int k,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
{
return a[k].val;
}
if(a[k].d)
down(k);
int mid=(l+r)/,lch=k*,rch=(k*)+;
int sum=;
if(x<=mid)
sum+=query(lch,l,mid,x,y);
if(y>mid)
sum+=query(rch,mid+,r,x,y);
return sum;
}

线段树——codevs 1690 开关灯的更多相关文章

  1. 线段树--codevs 1690 开关灯

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

  2. codevs 1690 开关灯 线段树+延迟标记

    1690 开关灯  时间限制: 1 s  空间限制: 128000 KB   题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这 ...

  3. codevs 1690 开关灯 线段树区间更新 区间查询Lazy

    题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的,六点之后,会有M(2<=m<=100000)个人 ...

  4. Codevs 1690 开关灯 USACO

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

  5. codevs——1690 开关灯

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

  6. RMQ 训练 之 codevs 1690 开关灯 已经搞定

    思路 懒标记法  记stop[rt] 表示 rt这个线段树节点的下方儿子们需要被更新几次  记住是下方 量纲不要乱  否则写的一堆渣代码 我的代码里面black是维护黑灯的数量 其实做烦了  如果是维 ...

  7. codevs 1690 开关灯 线段树水题

    没什么好说的,标记put表示开关是否开着. #include<cstdio> #include<cstring> #include<algorithm> using ...

  8. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  9. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

随机推荐

  1. Java源码之HashMap

    一.HashMap和Hashtable的区别 (1)HashMapl的键值(key)和值(value)可以为null,而Hashtable不可以 (2)Hashtable是线程安全类,而HashMap ...

  2. Leetcode 19——Remove Nth Node From End of List

    Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...

  3. C语言程序设计(基础)- 第7周作业(新)

    要求一(25经验值) 完成PTA中题目集名为<usth-C语言基础-第七周作业>和<usth-C语言基础-12周PTA作业>中的所有题目. 注意1:<usth-C语言基础 ...

  4. C语言第一次作业——输入输出格式

    题目1温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验代码 #include& ...

  5. C语言第二次博客作业---分支结构 陈张鑫

    一.PTA实验作业 题目1:计算分段函数[2] 本题目要求计算下列分段函数f(x)的值: 1.实验代码 int main(){double x,y; scanf("%lf",&am ...

  6. 20162311张之睿 Linux基础与Java开发环境实验报告

    实验一 Java开发环境的熟悉 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 1.没有Linux基础的同学建议先学习& ...

  7. PTA題目的處理(三)

    题目7-1 高速公路超速處罰 1.實驗代碼 #include <stdio.h> //#include <stdlib.h> int main() { int csp,lsp; ...

  8. Linux学习--线程控制

    关于线程控制,主要就是几个模块,我们一个一个消灭.消化: 一.线程创建: 1.先来看看在Linux环境下的线程创建函数: 分析:意思很明显: 1.函数名是 pthread_create  : 2.功能 ...

  9. 关于kali linux 2.0的vmware tools的安装问题

    在安装好kali linux 2.0 后,首先要做的就是添加源并更新系统,否则会出现软件定位问题. 在kali 2.0中,vmware tools已经不能使用了,官方放了一个工具下载安装就好. 添加源 ...

  10. Oracle闪回技术

    (一)闪回技术概要 闪回技术是数据库备份与恢复的重要补充手段,主要包括以下7种特性: 特性 原理 数据库支持 闪回查询(Flashback Query) 利用undo表空间中的回退信息,查询过去某个时 ...