跟昨天那个自己写的,没有按照模板来的一看风格就不相类似,今天模拟赛的时候就是用的我的那个自己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. [转]how can I change default errormessage for invalid price

    本文转自:http://forums.asp.net/t/1598262.aspx?how+can+I+change+default+errormessage+for+invalid+price I ...

  2. Murano Weekly Meeting 2015.09.29

    Meeting time: 2015.September.29th 1:00~2:00 Chairperson:  Serg Melikyan, PTL from Mirantis Meeting s ...

  3. [PHP]对象数组和普通数组总结

    1.碰到前台将JSON格式数据传递到服务器后台,经php的json_decode函数转换成的数组由于为对象数组,php程序无法对数据进行正常处理的情况,为此需要开发一个PHP回调函数(objarray ...

  4. Linux安装phpMyAdmin配置管理多个数据库

    1.下载 :phpMyAdmin 2.解压安装包: tar -zxvf phpMyAdmin-4.6.5.2-all-languages.tar.gz 3.替换目录 : mv phpMyAdmin-4 ...

  5. 微信小程序 列表渲染 wx:for

    wx:for控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件. wx:for-item指定数组当前元素,或当前项的变量名wx:for-index 指定数组当前下标的变量名 <view ...

  6. MySQL锁行锁表

    select..for update; 给数据库表手动上锁 --锁行Begin; for update; --给 id=1 的行加上排它锁且 id 有索引 ; Commit; -- 锁表 BEGIN; ...

  7. MSSql关闭自增列

    在对已经建好表结构的表抽取数据的时候,突然报错,根据Error发现,不能显式插入有自增列的值. 于是搜索后,用 set IDENTITY_INSERT #Tmp onset IDENTITY_INSE ...

  8. [Java][Liferay] 模拟用户

    以admin的帐号登陆 Navigation to Users and Organizations -> All Users 找到你要查看的user,点击Actions->Imperson ...

  9. 搭建maven web项目并配置quartz定时任务【业务:对比数据变化内容】 历程

    搭建maven web项目并配置quartz定时任务[业务:对比数据变化内容] 历程2018年03月03日 10:51:10 守望dfdfdf 阅读数:100更多个人分类: 工作 问题编辑版权声明:本 ...

  10. js中各种距离clientWidth

    1: offsetLeft.offsetTop.offsetHeight.offsetWidth 1.1 偏移参照——定位父级offsetParent   offsetParent的定义是:与当前元素 ...