线段树的应用xx中学模拟lites
跟昨天那个自己写的,没有按照模板来的一看风格就不相类似,今天模拟赛的时候就是用的我的那个自己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的更多相关文章
- 【BZOJ4388】JOI2012 invitation 堆+线段树+并查集(模拟Prim)
[BZOJ4388]JOI2012 invitation Description 澳洲猴举办了一场宴会,他想要邀请A个男生和B个女生参加,这A个男生从1到A编号,女生也从1到B编号.现在澳洲猴知道n组 ...
- 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)
原文地址:http://blog.csdn.net/zearot/article/details/48299459(如有侵权,请联系博主,立即删除.) 线段树详解 By 岩之痕 目录: 一:综述 ...
- poj 2528 Mayor's posters 线段树 || 并查集 离线处理
题目链接 题意 用不同颜色的线段覆盖数轴,问最终数轴上有多少种颜色? 注:只有最上面的线段能够被看到:即,如果有一条线段被其他的线段给完全覆盖住,则这个颜色是看不到的. 法一:线段树 按题意按顺序模拟 ...
- HDU 4942 Game on S♂play(线段树、模拟、扩栈)
比赛的时候想到这题的大概做法,但由于卡别的水题...就赛后做了... 题意:给一个二叉树,每个结点有一个w[i],有3种操作,0 x表示左旋x,1 x表示右旋x,3 x表示询问x结点的价值,其中,价值 ...
- 【8.26校内测试】【重构树求直径】【BFS模拟】【线段树维护DP】
题目性质比较显然,相同颜色联通块可以合并成一个点,重新建树后,发现相邻两个点的颜色一定是不一样的. 然后发现,对于一条链来说,每次把一个点反色,实际上使点数少了2个.如下图 而如果一条链上面有分支,也 ...
- 【2018.06.26NOIP模拟】T1纪念碑square 【线段树】*
[2018.06.26NOIP模拟]T1纪念碑square 题目描述 2034年,纪念中学决定修建校庆100周年纪念碑,作为杰出校友的你被找了过来,帮校方确定纪念碑的选址. 纪念中学的土地可以看作是一 ...
- 【BZOJ3252】攻略 DFS序+线段树(模拟费用流)
[BZOJ3252]攻略 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛> ...
- Luogu P4246 [SHOI2008]堵塞的交通(线段树+模拟)
P4246 [SHOI2008]堵塞的交通 题意 题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个\(2\)行\(C\)列的矩形 ...
- POJ-2886 Who Gets the Most Candies?(线段树+模拟)
题目大意:n个小孩按顺时针站成一圈,每次会有一个小孩出队(第一个出队的小孩已知),在他出队时会指定下一个出队的小孩,直到所有的小孩全部出队游戏结束.第p个出队的小孩会得到f(p)个糖果,f(p)为p的 ...
随机推荐
- ubuntu install fonts
sudo apt-get install ttf-wqy-zenhei
- mysql时间戳
select unix_timestamp('2013-01-01 10:10:10'); , '%Y-%m-%d %H:%i:%S' ) date_format(date,'%Y-%m-%d') - ...
- Http Client 源码分析
/** * 此接口仅代表HTTP请求执行的最基本约定. * 它对请求执行过程没有任何限制或特定的细节,并将状态管理.身份验证和重定向处理的细节留给单个实现. */ public interface H ...
- .net iis6中配置伪静态
1.右键点击 要设置网站的网站 2.属性 ——>主目录 ——>配置——> 3.如右侧窗口,找到 .aspx 扩展名——>编辑——>复制 可执行文件的路径——>关闭 ...
- 使用ajax获取用户所在地的天气
1.要获取用户归属地的天气,首先得获取用户所在的市区, 这里先获取用户的IP,通过IP获取IP的归属地,从而得到用户 地址. 获取客户端ip: js: <scripttype="tex ...
- Java中的阻塞队列-ArrayBlockingQueue(一)
最近在看一些java基础的东西,看到了队列这章,打算对复习的一些知识点做一个笔记,也算是对自己思路的一个整理,本章先聊聊java中的阻塞队列 参考文章: http://ifeve.com/java-b ...
- Hibernate课程 初探一对多映射4-1 inverse属性
1 <Set>节点的inverse属性默认由one方来维护(默认值为false).将inverse属性修改为true则由多方来维护.
- VueJs组件prop验证简单理解
今天看了vuejs的组件,看到了prop组件,主要作用是在传入数据的时候对传入的值做判断,写了个小例子. <div id="app"> <my-child :nu ...
- 转:Oracle优化总结
本文主要从大型数据库ORACLE环境四个不同级别的调整分析入手,分析ORACLE的系统结构和工作机理,从九个不同方面较全面地总结了 ORACLE数据库的优化调整方案. 关键词 ORACLE数据库 环境 ...
- SpringCloud的学习记录(7)
这一章节讲zuul的使用. 在我们生成的Demo项目上右键点击New->Module->spring Initializr, 然后next, 填写Group和Artifact等信息, 这里 ...