跟昨天那个自己写的,没有按照模板来的一看风格就不相类似,今天模拟赛的时候就是用的我的那个自己YY的代码,才拿了10分。个人认为关键的问题应该在于对于数据的处理太过繁琐了,所以回来之后,就拿了大佬的程序对照着改。在这里不得不吐槽一下c++的读入,cin40分,scanf满分。还是模板的线段树比较清晰,决定以后就用这种了。

开关灯
源文件: lites.cpp/.c/.pas
输入文件: lites.in
输出文件: lites.out
时限: 1s
空间: 256M
【题目描述】
小Y尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷,其中一个大型玩具是牛栏中的灯。
N (<= N <= ,) 头奶牛中的每一头被连续的编号为1..N, 站在一个彩色的灯下面。刚到傍晚的时候, 所有的灯都是关闭的。奶牛们通过N个按钮来控制灯的开关,按第i个按钮可以改变第i个灯的状态。
奶牛们执行M (<= M <= ,)条指令, 每个指令都是两个整数中的一个(<= 指令号<= )。
第1种指令(用0表示)包含两个数字S_i和E_i (<= S_i<= E_i<= N), 它们表示起始开关和终止开关。奶牛们只需要把从S_i到E_i之间的按钮都按一次, 就可以完成这个指令。
第2种指令(用1表示)同样包含两个数字S_i和E_i (<= S_i<= E_i<= N), 不过这种指令是询问从S_i到E_i之间的灯有多少是亮着的。
请你帮助小Y确保他的奶牛们可以得到正确的答案。
【输入格式】
第 行: 用空格隔开的两个整数N和M。
第 ..M+ 行: 每行表示一个操作, 有三个用空格分开的整数: 指令号, S_i 和 E_i。
【输出格式】
对于每一次询问, 输出一行表示询问的结果。
【输入样例】 【输出样例】 【样例解释】
一共有4盏灯,5个指令。下面是执行的情况:
灯 Init: O OOOO = 关* = 开
-> * * O O改变灯 和 的状态
-> * O * *
-> 输出在2..3的范围内有多少灯是亮的
-> * * O O改变灯 , 和 的状态
-> 输出在1..4的范围内有多少灯是亮的
【数据规模】
对于40%的数据满足:<=N,M<=;
对于100%的数据满足: <=N,M<=。

(很明显的线段树,开始我还很开心,因为昨天刚调出来,以为要AC了)。

下面是自己改的代码。

 #include<bits/stdc++.h>
using namespace std;
struct node{
int l,r,dat,lazy;
}shu[];//结构体,中间的任何一个单独成为一个数组都是可以的,其实没有什么高大上的,只是看起来比较高逼格而已。
int n,m,a,b,c,ans;//个人建议多设全局变量,Pascal的优良传统,比较方便,不容易错。
void build_tree(int x,int y,int z){//建树,和昨天我的代码是一样的(不对,是今天)。
shu[x].l=y;
shu[x].r=z;
if (y==z) return;
int o=(y+z)/;
build_tree(x*,y,o);
build_tree(x*+,o+,z);
}
void caozuo(int x){//操作,为什么要单独在一个过程中呢?因为下面两段都要用到,更方便编程思路更清晰。
if (shu[x].lazy){//开灯的时候改变。也可以用bool数组。
shu[x*].dat=(shu[x*].r-shu[x*].l+)-shu[x*].dat;//这是因为一部分是开的,那么改变了之后,另一部分就是开的,这一部分是关的。
shu[x*+].dat=(shu[x*+].r-shu[x*+].l+)-shu[x*+].dat;
if (shu[x*].lazy) shu[x*].lazy=;
else shu[x*].lazy=;
if (shu[x*+].lazy) shu[x*+].lazy=;
else shu[x*+].lazy=;
shu[x].lazy=;//处理完了,lazy标记还原。
}
}
void add_tree(int x){
if (shu[x].l>=b&&shu[x].r<=c){
shu[x].dat=(shu[x].r-shu[x].l+)-shu[x].dat;//两遍开就是关
if (shu[x].lazy) shu[x].lazy=;
else shu[x].lazy=;
return;
}
caozuo(x);
int o=(shu[x].l+shu[x].r)/;
if(b<=o) add_tree(x*);//如果中间数比要改变区间最左边大或相等,查找左子树。
if(c>o) add_tree(x*+);//如果中间数比要改变区间最右边小,查找右子树。
shu[x].dat=shu[x*].dat+shu[x*+].dat;//更新父节点
}
void find_tree(int x){//查找区间和。
if (shu[x].l>=b&&shu[x].r<=c){//在要查区间内就加上对应区间和,不用往下找,因为子结点的区间在父节点的区间之内,不应该重复。
ans=ans+shu[x].dat;
return;
}
caozuo(x);
int o=(shu[x].l+shu[x].r)/;
if(b<=o) find_tree(x*);
if(c>o) find_tree(x*+);
return;
}
int main(){
scanf("%d%d",&n,&m);
build_tree(,,n);
for (int i=;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
if (a==){
add_tree();
}
else {
ans=;
find_tree();
printf("%d\n",ans);
}
}
return ;
}

难点是如何处理开着灯的数量,这就要求我们在更新的过程中,对lazy进行处理。

线段树的应用xx中学模拟lites的更多相关文章

  1. 【BZOJ4388】JOI2012 invitation 堆+线段树+并查集(模拟Prim)

    [BZOJ4388]JOI2012 invitation Description 澳洲猴举办了一场宴会,他想要邀请A个男生和B个女生参加,这A个男生从1到A编号,女生也从1到B编号.现在澳洲猴知道n组 ...

  2. 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)

    原文地址:http://blog.csdn.net/zearot/article/details/48299459(如有侵权,请联系博主,立即删除.) 线段树详解    By 岩之痕 目录: 一:综述 ...

  3. poj 2528 Mayor's posters 线段树 || 并查集 离线处理

    题目链接 题意 用不同颜色的线段覆盖数轴,问最终数轴上有多少种颜色? 注:只有最上面的线段能够被看到:即,如果有一条线段被其他的线段给完全覆盖住,则这个颜色是看不到的. 法一:线段树 按题意按顺序模拟 ...

  4. HDU 4942 Game on S♂play(线段树、模拟、扩栈)

    比赛的时候想到这题的大概做法,但由于卡别的水题...就赛后做了... 题意:给一个二叉树,每个结点有一个w[i],有3种操作,0 x表示左旋x,1 x表示右旋x,3 x表示询问x结点的价值,其中,价值 ...

  5. 【8.26校内测试】【重构树求直径】【BFS模拟】【线段树维护DP】

    题目性质比较显然,相同颜色联通块可以合并成一个点,重新建树后,发现相邻两个点的颜色一定是不一样的. 然后发现,对于一条链来说,每次把一个点反色,实际上使点数少了2个.如下图 而如果一条链上面有分支,也 ...

  6. 【2018.06.26NOIP模拟】T1纪念碑square 【线段树】*

    [2018.06.26NOIP模拟]T1纪念碑square 题目描述 2034年,纪念中学决定修建校庆100周年纪念碑,作为杰出校友的你被找了过来,帮校方确定纪念碑的选址. 纪念中学的土地可以看作是一 ...

  7. 【BZOJ3252】攻略 DFS序+线段树(模拟费用流)

    [BZOJ3252]攻略 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛> ...

  8. Luogu P4246 [SHOI2008]堵塞的交通(线段树+模拟)

    P4246 [SHOI2008]堵塞的交通 题意 题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个\(2\)行\(C\)列的矩形 ...

  9. POJ-2886 Who Gets the Most Candies?(线段树+模拟)

    题目大意:n个小孩按顺时针站成一圈,每次会有一个小孩出队(第一个出队的小孩已知),在他出队时会指定下一个出队的小孩,直到所有的小孩全部出队游戏结束.第p个出队的小孩会得到f(p)个糖果,f(p)为p的 ...

随机推荐

  1. [转]href="#"与javascript:void(0)的区别

    本文转自:http://www.cnblogs.com/suizhikuo/p/3928411.html 如果我们想把a标签中的链接置成空链接,我们一般会用两种方法: 1 <a href=&qu ...

  2. apache服务器启动出错

    启动本地xampp的服务器时,报错如下所示: 错误提示很明确: 就是指我们希望使用的端口被占用,由于xampp默认使用的端口是80(http协议).443(https协议),也就是说这两个端口被其他的 ...

  3. java 多线程 yield方法的意义

    Thread.yield( )方法: 使当前线程从执行状态(运行状态)变为可执行态(就绪状态).cpu会从众多的可执行态里选择,也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,并不是说一 ...

  4. 提交表单之前对表单进行检查的方法 onsubmit="return checkSubmit();"

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. C# 压缩 解压 复制文件夹,文件的操作

    命名空间:namespace System.IO.Compression 压缩: //目标文件夹 string fileDirPath = "/Downloads/试题" + us ...

  6. vue-样式问题

    问题: 今天在用vue开发单页面应用的时候,遇到一个问题,在A页面,直接刷新,页面的布局样式之类的是没有问题的,不过在B页面跳转到A页面,那么A页面有一些样式就不是预期的效果. 发现解决问题: 用调试 ...

  7. orientationchange事件

    orientationchange事件 resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize':

  8. 【MATLAB】对离散采样信号添加高斯白噪声(已知Eb/N0)

    (1)首先计算已知信号序列(采样之后得到的信号)的平均功率.该序列在第n个点处的功率为: 如果已知的信号序列中的总共的点数为N个,则该序列的平均功率为: 在MATLAB中求平均功率的方法是: Pav= ...

  9. centos7 安装sqlserver驱动以及扩展

    安装sqlserver驱动 sudo su curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repo ...

  10. Ehcache的配置与使用

    Ehcache是JAVA内制的一个缓存框架! 目的:缓解频繁读取数据库的压力; 初步配置如下: <?xml version="1.0" encoding="UTF- ...