【洛谷P2846】光开关【线段树】

T12 电烙铁简单程序逻辑 通过分析就可以知道,发热丝本身即是发热体,也是热偶的工作端。怎么可能是热电动势呢,确实,但不要忘了T12-OUTPUT端的电压是PWM波,理论上是有单片机PWM电压为0 v时的,而T12-OUTPUT端的电压此时也应为0。在T12烙铁头中,PID控制算法通过监测温度传感器的输出,计算当前温度与设定温度之间的差异,并根据这一差异调节加热功率,以实现烙铁头温度的精确控制。这段代码实现了一个简单的增量式PID控制器,通过计算当前温度与期望温度之间的差异以及历史偏差值,调节输出控制量,实现对温度的精确控制。 阅读详情

题目大意:

题目链接:https://www.luogu.org/problemnew/show/P2846
给出一个01串,每次有两种操作:

  • 0   x   y 0\ x\ y 0 x y,表示将 x x x到 y y y之间全部取反。
  • 1   x   y 1\ x\ y 1 x y,表示输出 x x x到 y y y之间1的个数。

思路:

首先,这是一道三倍经验题。
P2574 XOR的艺术
P3870 [TJOI2009]开关
(这两道题可以用分块做,但是光开关用分块会T)


这道题其实就是一个裸的线段树。用 t r e e [ x ] . l tree[x].l tree[x].l和 t r e e [ x ] . r tree[x].r tree[x].r表示这个区间的左右端点, t r e e [ x ] . n u m tree[x].num tree[x].num表示这个区间有多少个1, t r e e [ x ] . l a z y tree[x].lazy tree[x].lazy就是懒惰标记。
其中只有 t r e e [ x ] . l a z y tree[x].lazy tree[x].lazy和线段树模板不一样。由于很明显如果我们将同一个区间取反两次,那么就是没有取反的意思。所以, t r e e [ x ] . l a z y tree[x].lazy tree[x].lazy其实只要表示这个区间是否被按了奇数次就可以了(按偶数次其实就是按很多个两次,依旧没变),所以 t r e e [ x ] . l a z y tree[x].lazy tree[x].lazy的取值就只会是0或1(0表示按了偶数次,1表示按了奇数次),每次更新时异或1即可。
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)


分块的做法也稍微提一下。可以将这个总区间分成 n \sqrt{n} n ​个小区间,每次直接在每个小区间内更新,与分块模板也很像。
时间复杂度: O ( n n ) O(n\sqrt{n}) O(nn ​)


线段树模板:https://blog.youkuaiyun.com/SSL_ZYC/article/details/81045174
分块模板:https://blog.youkuaiyun.com/SSL_ZYC/article/details/81978158


代码:

#include <cstdio>
#define N 1000100
using namespace std;

int n,m,w,x,y;

struct node
{
	int l,r,lazy,num;
}tree[N*3];

void make(int x) 
{
	if (tree[x].l==tree[x].r) return;
	int mid=(tree[x].l+tree[x].r)/2;
	tree[x*2].l=tree[x].l;
	tree[x*2].r=mid;
	tree[x*2+1].l=mid+1;
	tree[x*2+1].r=tree[x].r;
	make(x*2);
	make(x*2+1);
}

void pushdown(int x)  //下传标记
{
	if (tree[x].lazy)
	{
		tree[x*2].num=tree[x*2].r-tree[x*2].l+1-tree[x*2].num;
		tree[x*2].lazy^=1;
		tree[x*2+1].num=tree[x*2+1].r-tree[x*2+1].l+1-tree[x*2+1].num;
		tree[x*2+1].lazy^=1;
		tree[x].lazy=0;
	}
}

int ask(int x,int l,int r)  //查找
{
	if (tree[x].l==l&&tree[x].r==r) return tree[x].num;
	if (tree[x].l==tree[x].r) return 0;
	pushdown(x);
	int mid=(tree[x].l+tree[x].r)/2;
	if (l>mid) return ask(x*2+1,l,r);
	if (r<=mid) return ask(x*2,l,r);
	return ask(x*2,l,mid)+ask(x*2+1,mid+1,r);
}

void change(int x,int l,int r)  //修改
{
	if (tree[x].l==l&&tree[x].r==r)
	{
		tree[x].num=tree[x].r-tree[x].l+1-tree[x].num;  //更新每个区间的值
		tree[x].lazy^=1;
		return;
	}
	if (tree[x].l==tree[x].r) return;
	pushdown(x);
	int mid=(tree[x].l+tree[x].r)/2;
	if (l>mid)
	{
		change(x*2+1,l,r);
		tree[x].num=tree[x*2].num+tree[x*2+1].num;  //更新每个区间的值
		return;
	}
	if (r<=mid)
	{
		change(x*2,l,r);
		tree[x].num=tree[x*2].num+tree[x*2+1].num;  //更新每个区间的值
		return;
	}
	change(x*2,l,mid);
	change(x*2+1,mid+1,r);
	tree[x].num=tree[x*2].num+tree[x*2+1].num;  //更新每个区间的值
}

int main()
{
	scanf("%d%d",&n,&m);
	tree[1].l=1;
	tree[1].r=n;
	make(1);
	while (m--)
	{
		scanf("%d%d%d",&w,&x,&y);
		if (w)
		{
			printf("%d\n",ask(1,x,y));
		}
		else
		{
			change(1,x,y);
		}
	}
	return 0;
}
Google Earth Engine:计算逐年全球潜在蒸发量(PET)的 ERA 数据 通过获取温度、湿度和降水数据,并使用Penman-Monteith公式,我们可以得到每年的潜在蒸发量。在本文中,我们将使用Google Earth Engine平台和ERA(欧洲再分析气象数据集)数据来计算逐年全球的潜在蒸发量(PET)。接下来,我们需要对ERA数据进行预处理,以获取我们需要的潜在蒸发量数据。有了温度、湿度和降水数据,我们可以使用Penman-Monteith公式来计算每年的潜在蒸发量。最后,我们可以将计算得到的潜在蒸发量数据进行可视化,以便更好地理解全球的水汽蒸发情况。 阅读详情

相关推荐

直流电源EMI滤波器设计实战:从器件选型到PCB布局的完整指南

本文提供了一份直流电源EMI滤波器的完整实战设计指南。针对EMI噪声超标问题,文章深入剖析了差模与共模噪声的抑制原理,详细讲解了从电路拓扑、核心器件(如X/Y电容、共模电感)的选型计算,到决定性能成败的PCB布局艺术。重点强调了低阻抗路径、干净接地及输入输出隔离等关键布局原则,并分享了常见的调试坑点与排查方法,旨在帮助硬件工程师设计出真正有效的滤波器,确保电源系统通过EMC测试。

q9r0s的博客 642

【区间dp】【Gym 100712L】01串切割问题 + 线段树优化

题意:         有一个01串,切割的规则为: ①切割后的子串不能是 0101 或者 1010 这样交替的子串 ②切割后的子串长度不能超过 K         询问最少的切割次数   样例:          4                   //4组数据          6 3                //原串长度为6,子串的最长长度为3          ...

lucius-liu.cn 578

Anaconda镜像源切换全攻略:从清华源到恢复默认设置的完整流程

本文详细介绍了Anaconda镜像源的管理与优化,重点讲解了如何配置清华源以提升国内下载速度。内容涵盖镜像源工作原理、清华源详细配置步骤、多源管理策略、常见问题排查以及如何安全恢复默认设置,帮助用户构建完整的镜像源管理体系。

weixin_28828243的博客 1021

【洛谷题单刷题日记】线段树

1:洛谷 P3372 【模板】线段树 1   线段树是用来解决区间和/区间最值/区间覆盖的问题,而本道题涉及到了区间和问题,是区间修改和区间查询的问题(单点查询和单点修改对应的就是l==rl==rl==r的情况)。如果修改一个区间时,每次都修改到叶结点,那么一个叶节点的修改所需的复杂度是O(nlogn)O(nlogn)O(nlogn),修改一次区间的时间复杂度是O(nlogn)O(nlogn)O(nlogn),QQQ次区间修改的时间复杂度是O(n2logn)O(n^2logn)O(n2logn),效率甚至低

CUMT_William_Liu的博客 690

从零开始:使用英伟达nx开发板部署目标检测算法的全过程

英伟达nx开发板烧录、依赖安装、开发板联网

weixin_51192760的博客 3762

AI 小说生成器本地部署完全指南

这篇文章介绍了本地部署AI小说生成器的完整指南,主要面向网文作者、内容创作者和AI爱好者。文章从环境搭建到创作实践,详细讲解了三种主流部署方案:Ollama(推荐新手)、LMStudio(图形界面)和text-generation-webui(高级定制)。内容涵盖硬件需求、系统架构、模型选择、API对接、提示词工程等关键技术环节,并提供了小说创作的特制提示词模板和参数调优建议。文章还讨论了长篇小说管理、多模型协作等进阶技巧,以及版权伦理等法律问题。最后推荐了相关工具资源和社区论坛,帮助读者实现安全、高效、可

珂珂可爱多 2271

[洛谷]P3372 【模板】线段树 1 (#线段树)

题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。 接下来M行每行包含3或4个整数,表示一个操作,具体如下: 操作1: 格式:1 x y k 含义:将区间[...

A.pro的博客 582

测试dali协议的软件,DALI2.0和DALI1.0完美兼容同一个模块,测试每项可过协议

DALI2.0和DALI1.0完美兼容同一个模块,测试每项可过协议深圳聚积智能 夏先生 13246760327 QQ 349098308■IEC62386-102(V2.0)通过测试内容IEC62386-102/2.1/Test preambleIEC62386-102/3.1/Polarity testIEC62386-102/3.2/Maximum and minimum system v...

weixin_35343788的博客 1351

[C++]洛谷 【模板】线段树1 详解+lazy标志优化

通过这道模板题,我将对线段树的原理和代码实现进行总结,内容包括段树开辟4n空间的原因、完整代码剖析、lazy标志优化、线段树与差分数组的比较等

weixin_62712365的博客 1419

Flotherm XT新手必看:5分钟搞定自然对流热仿真(附案例文件)

本文为Flotherm XT新手提供了自然对流热仿真的快速入门指南,通过详细的步骤解析和实用技巧,帮助用户在5分钟内完成从建模到后处理的全流程。重点介绍了环境设置、几何建模、材料属性、网格划分等关键环节,并附有案例文件供参考学习,助力工程师快速掌握热仿真技术。

weixin_30839881的博客 629

智能车图像处理24-进阶篇16--三叉路口的判断

这篇文章主要讲述图像处理中如何判断三叉路口并进行补线操作。

taiyuezyh的博客 1万+

CSU 2187 思维+贪心

http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=2187 Description 给当一个01串,最多可以对一段区间里的01取反一次,求最多能取得的1的个数 Input 多组数据,第一行为数组组数T(T<=10) 每组数据第一行一个整数N,1<=N<=1000000 第二行一个长度为N的01字符串 O...

xiji333的博客 618

【Hermes Agent】2026 Hermes Agent 最新入门级实战指南:从原理、部署、模型配置到落地 Demo

当下 Vibe Coding、AI 自动化时代,单纯对话大模型已经没有竞争力,

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 244

洛谷P2846 [USACO08NOV]光开关Light Switching 线段树+区间反转

洛谷P2846 [USACO08NOV]光开关Light Switching 标签 线段树 区间反转 简明题意 给出一排初始时都关闭着的灯,现需要你支持两张操作。 将区间[L,R]的灯都反转 询问区间[L,R]亮着的灯的数量 思路 区间操作显然线段树可以解决 我们给每个节点两个属性: sum表示当前区间开着的灯的数量 tag表示这个区间的开关还有多少次未被按下 我们...

danzh 519

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

洛谷P2574 XOR的艺术 线段树+区间反转

洛谷P2574 XOR的艺术 标签 线段树 区间反转 简明题意 这题实际上就是 洛谷2846 光开关 题解 思路 思路可以直接看上面的题解了。这题只是换了个情景,然后默认给了你初始的开关灯情况,而那题默认所有的灯都是关闭的。这里可以直接把初始的01串当成命令,遇到0执行一次change即可 注意事项 无 总结 无 AC代码 #include<cstdio&g...

danzh 295

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

线段树总结

高级数据结构——线段树总结 本蒟蒻最近在做线段树的题,做了一小部分,有感而发,故写下这篇博客,如有错误,请大佬指出。 线段树,作为一种高级数据结构,而其作用与分块、树状数组均有一脉相承的部分,而且有的题均可以使用上面的两种算法去解决(当然只是一部分题) 对于线段树的介绍,我也就不再多说了,即对于数列将其放在树上进行维护一些值,在题目的要求下进行修改和更新,最后得到答案。 首先我们先上一两...

weixin_30545285的博客 168

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

洛谷——P2846 [USACO08NOV]光开关Light Switching

P2846 [USACO08NOV]光开关Light Switching 题目大意: 灯是由高科技——外星人鼠标操控的。你只要左击两个灯所连的鼠标, 这两个灯,以及之间的灯都会由暗变亮,或由亮变暗。右击两个灯所连的鼠 标,你就可以知道这两个灯,以及之间的灯有多少灯是亮的。起初所有灯都是暗的,你的任务是在LZ之前算出灯的亮灭。 线段树的懒标记下传 #include&...

weixin_30439131的博客 217

洛谷P2846 光开关Light Switching

题目描述 灯是由高科技——外星人鼠标操控的。你只要左击两个灯所连的鼠标, 这两个灯,以及之间的灯都会由暗变亮,或由亮变暗。右击两个灯所连的鼠 标,你就可以知道这两个灯,以及之间的灯有多少灯是亮的。起初所有灯都是暗的,你的任务是在\(LZ\)之前算出灯的亮灭。 输入输出格式 输入格式: 第1 行: 用空格隔开的两个整数\(N\) 和\(M\),\(N\) 是灯数 第\(2..M+1\) 行: 每行表...

weixin_30325071的博客 178

洛谷 P3870 [TJOI2009]开关 / P2846 [USACO08NOV]光开关Light Switching

题目 水题,不知道哪来的省选难度    线段树维护一下就行   这里我用了个小技巧:    开的灯关了,关的灯开了,灯的总数不变     只是把这两者数量交换下    例如:    1 0 1 0 1 1     开着的灯的数量:4    关着的灯的数量:2 操作一次后:   0 1 0 1 0 0    开着的灯的数量:2      关着的灯的数量:4 就是把2和4交换下,似乎比较容易...

Warriors Dynasty 273

洛谷2846 USACO08NOV 光开关 Light Switching

题目:Light Switching思路:区间修改区间查询的线段树。代码:#include &lt;cstdio&gt; #include &lt;iostream&gt; #include &lt;algorithm&gt; #include &lt;stack&gt; #include &lt;queue&gt; #include &lt;deque&gt; #include &lt;set&

iwi 361

线段树练习(也有树状数组)

洛谷 P2184 贪婪大陆 题目背景 面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败……人类被蚂蚁们逼到了Greed Island上的一个海湾。现在,小FF的后方是一望无际的大海, 前方是变异了的超级蚂蚁。 小FF还有大好前程,他可不想命丧于此, 于是他派遣手下最后一批改造SCV布置地雷以阻挡蚂蚁们的进攻。 题目描述 小FF最后一道防线是一条长度为N的战壕, 小...

weixin_38169359的博客 251

线段树详解(洛谷模板题)

一、算法概况     线段树是一种二叉搜索树,它将一个区间分成多个单元区间,每个单元区间对应线段树的一个叶子节点,有查询区间和,查询区间最大值、最小值等功能(本篇讲解的是求区间和的代码),由于它二叉结构的特性,使得他的操作复杂读为O(logN)     线段树的根节点代表所要维护的值在总区间 [a,b] 的值,他的左子节点代表区间 [a,(a+b)/2] ,他的右子节点代表区间 [(a+b)/

spencer12138的博客 1336

洛谷P3960 队列(线段树)(详解)

我将详细讲解如何用线段树解决这道问题,感兴趣就看看吧

idio_dsfrbeki的博客 367

01串

Problem:01串 Description: 现在我们有一个由01组成的字符串。我们需要在上面做一些操作。每次我们都选一个“01”子串,把他替换成110。如果找不到“01”子串,那么操作结束。请输出总共进行了多少次操作,结果请mod 1e9+7。 Ps:“01”子串必须是相邻的0和1,字符串中只包含0和1。 Input: 首先一个T,代表接下来有T行。 接下来的T行,每行一个字符串str(1&...

Welcome to csdn_PatrickStar's blog 923

51nod 1391 01串(思维+前缀和或者线段树)

给定一个01串S,求出它的一个尽可能长的子串S[i..j],满足存在一个位置i<=x <j, S[i..x]中0比1多,而S[x + 1..j]中1比0多。求满足条件的最长子串长度。 收起 输入 一行包含一个只由0和1构成的字符串S。 S的长度不超过1000000。 输出 一行包含一个整数,表示满足要求的最长子串的长度。 输入样例 10 输出样例 0 ...

pxlsdz的博客 655

51nod 1391 01串【线段树,思维】

题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1391题意:给定一个01串S,求出它的一个尽可能长的子串S[i..j],满足存在一个位置i<=x < j, S[i..x]中0比1多,而S[x + 1..j]中1比0多。求满足条件的最长子串长度。 Input一行包含一个只由0和1构成的字符串S。 S的长度不超过100

HARD_UNDERSTAND 679
上一篇: 【洛谷P1144】最短路计数【最短路】
下一篇: 【HDU 1054】Strategic Game【树形DP】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值