跟昨天那个自己写的,没有按照模板来的一看风格就不相类似,今天模拟赛的时候就是用的我的那个自己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. IIS/asp.net管道

    http://referencesource.microsoft.com/ 理解ASP.NET的前提是对ASP.NET管道式设计的深刻认识.而ASP.NET Web应用大都是寄宿于IIS上的. IIS ...

  2. 【Python学习一】使用Python+selenium实现第一个自动化测试脚本

    1.Python的下载 python官方下载地址:https://www.python.org/downloads/ 这边安装的3.6.5为最新版本以适应未来的需求 进入页面就有两个版本的下载选择,2 ...

  3. Js中parseFloat()方法所产的精度不一致问题

    <script language="javascript"> function checkForm(){ var Sum="0.11"; var S ...

  4. Snipaste的详细安装和使用

    Snipaste安装和使用 1:snipaste的安装 步骤一: https://zh.snipaste.com/  ,去此官网下载. 步骤二:由于此是个绿色软件,直接解压即可. 步骤三:使用,见官网 ...

  5. Hibernate课程 初探多对多映射3-1 课程总结

    如何通过添加中间表实现多对多? 1 在双方实体中添加一个保存对方的集合. 2 在双方映射文件中 使用<set>和<many-to-many>元素进行关联关系配置(注意此处)

  6. jq中事件绑定的方法

    在唯品会实习生面试中,被面试官问了这么一个问题,“jQuery中绑定事件的方法有几个?”,以click事件为例,我当时想到的只有.click(),.bind(),.on()这三种,然后面试官又追问,“ ...

  7. Vue.js - Day2

    品牌管理案例 添加新品牌 删除品牌 根据条件筛选品牌 1.x 版本中的filterBy指令,在2.x中已经被废除: filterBy - 指令 ​<tr v-for="item in ...

  8. python反爬之用户代理

    # requests是第三方库,需要安装 pip install requests import requests import random # 通常很多网站都会设置检测请求头中的User-Agen ...

  9. C++ VS编译问题--LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    用VS编译时,当出现错误LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏: 这个问题的解决方案为: 1. 找到项目\xx属性\配置属性\清单工具\输 ...

  10. 绘图之Canvas学习

    一  Canvas的用法   博客:http://blog.taorenjia.com/?p=237    1.drawCircle(float cx, float cy, float radius, ...