跟昨天那个自己写的,没有按照模板来的一看风格就不相类似,今天模拟赛的时候就是用的我的那个自己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. LeetCode 881.救生艇(C++)

    第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit. 每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit. 返回载到每一个人所需的最小船数.(保证每个人都 ...

  2. OpenCV细化算法简单解析

    细化算法它的原理也很简单: 我们对一副二值图像进行骨架提取,就是删除不需要的轮廓点,只保留其骨架点.假设一个像素点,我们定义该点为p1,则它的八邻域点p2->p9位置如下图所示,该算法考虑p1点 ...

  3. 【LDAP】LDAP介绍

    原文:http://ldapman.org/articles/intro_to_ldap.html原文作者:Michael Donnelly 什么是LDAP? LDAP的英文全称是Lightweigh ...

  4. PHP高级分离术

    <!--高级分离术-->   <table border='1px'>         <?php foreach($data as $key=>$value){ ...

  5. 快速学习 Python 数据分析包 之 pandas

    最近在看时间序列分析的一些东西,中间普遍用到一个叫pandas的包,因此单独拿出时间来进行学习. 参见 pandas 官方文档 http://pandas.pydata.org/pandas-docs ...

  6. CRLF注入攻击

      原理:http数据包通过\r\n\r\n来分开http header何http body 实现:首先这种攻击发生在应用层,且发生在服务器返回给我们的http reponse没有经过敏感字符的过滤, ...

  7. jQuery源码浅析2–奇技淫巧

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  8. 异步对象(XMLHttpRequest)的帮助脚本

    异步对象五部曲 这是post请求的. //1.00创建异步对象 var xhr = new XMLHttpRequest(); //2.0 xhr.open("post", url ...

  9. java基础:JDK环境安装

    根据操作系统位数(32/64,一般64位向下兼容),项目要求版本,下载对应JDK安装包 配置环境变量 JAVA_HOME C:\Program Files\Java\jdk1.7.0_80 PATH ...

  10. Spring-cloud微服务 Eureka学习教程-分布式搭建EurekaServer、EurekaClient(中级)

    我们这里只有一台服务器,所以我们先仿集群搭建. 完整demo项目代码:https://github.com/wades2/EurekaDemo2 在这之前我们先分析分析Eureka相比其他注册中心的好 ...