“红旗杯”第十五届东北地区大学生程序设计竞赛 D - Lowbit (gym-103145-D)

本文主要是介绍“红旗杯”第十五届东北地区大学生程序设计竞赛 D - Lowbit (gym-103145-D),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接
一开始看官方题解没看懂 看了一波大佬的题解…
链接
(线段树 + 思维)

本题是给出两种操作 一种是 给出一个区间,将区间内的数字都加上自身的lowbit 另一种是求出区间总和 如果暴力单点修改每个点加上自身lowbit肯定是会TLE,我们需要去进行区间修改
我们可以发现所有2的n次方加上自身的lowbit都可以用乘2(左移1位)来达到
2 = 10B 4 = 100B 8 = 1000B 16 = 10000B
而且所有的非2的n次方加上自身的lowbit就是将最右边的1左移1位,那么根据题目中的数据范围是1e9 = 2的30次方,也就是最大情况下会以101010101的形式存在,最多移动15次后就变成了2的n次方,就可以用乘2的方法来实现了
如果当前区间内有不是2的n次方的就一直向下进行暴力单点修改,反正单点最多需要修改15次就可以变成2的n次方
最后如果当前区间内全部都是2的n次方,那么我们就可以利用lazy存需要乘几次2进行区间修改就可以了
需要用一个数组来记录是否当前区间内全部数都是2的n次方
如果一个数不是2的n次方那么需要注意在成为2的n次方前不可以取模 取模会影响答案

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;#define ll long long const int M = 100010;
const ll MOD = 998244353;ll num[M];ll tree[M << 2], lazy[M << 2];
// jg用来判断当前区间是否全部都是2的n次方
bool jg[M << 2];ll lowbit(ll x) {return x & (-x);}void pushup(int rt) {if (jg[rt << 1] && jg[rt << 1 | 1]) jg[rt] = true;tree[rt] = tree[rt << 1] + tree[rt << 1 | 1];tree[rt] %= MOD;}
void build(int rt, int l, int r) {jg[rt] = false;lazy[rt] = 1;if (l == r) {tree[rt] = num[l];// 如果tree[rt] == lowbit(tree[rt])则说明是2的n次方if (tree[rt] == lowbit(tree[rt])) jg[rt] = true;return;}int mid = (l + r) >> 1;build(rt << 1, l, mid);build(rt << 1 | 1, mid + 1, r);pushup(rt);
}void pushdown(int rt) {if (lazy[rt] > 1) {tree[rt << 1] *= lazy[rt];tree[rt << 1] %= MOD;tree[rt << 1 | 1] *= lazy[rt];tree[rt << 1 | 1] %= MOD;lazy[rt << 1] *= lazy[rt];lazy[rt << 1] %= MOD;lazy[rt << 1 | 1] *= lazy[rt];lazy[rt << 1 | 1] %= MOD;lazy[rt] = 1;}
}void update(int rt, int l, int r, int L, int R) {if (R < l || L > r) return;if (L >= l && R <= r && jg[rt]) {tree[rt] = tree[rt] << 1;tree[rt] %= MOD;lazy[rt] = lazy[rt] << 1;lazy[rt] %= MOD;return;}if (L >= l && R <= r && R == L) {tree[rt] += lowbit(tree[rt]);// 需要注意在成为2的n次方前不可以取模 取模会影响答案if (tree[rt] == lowbit(tree[rt])) {jg[rt] = true;   tree[rt] %= MOD;}return;}int mid = (L + R) >> 1;pushdown(rt);update(rt << 1, l, r, L, mid);update(rt << 1 | 1, l, r, mid + 1, R);pushup(rt);
}ll query(int rt, int l, int r, int L, int R) {if (R < l || L > r) return 0;if (L >= l && R <= r) return tree[rt] % MOD;pushdown(rt);int mid = (L + R) >> 1;ll ans = 0;ans += query(rt << 1, l, r, L, mid);ans %= MOD;ans += query(rt <<1 | 1, l, r, mid + 1, R);ans %= MOD;return ans;
}int main() {int t;scanf("%d", &t);while (t--) {int n;scanf("%d", &n);for (int i = 1; i <= n; ++i) scanf("%lld", &num[i]);build(1, 1, n);int op, op1, l, r;scanf("%d", &op);while (op--) {scanf("%d", &op1);if (op1 == 1) {scanf("%d%d", &l, &r);update(1, l, r, 1, n);}else if (op1 == 2) {scanf("%d%d", &l, &r);printf("%lld\n", query(1, l, r, 1, n));}}}return 0;
}

这篇关于“红旗杯”第十五届东北地区大学生程序设计竞赛 D - Lowbit (gym-103145-D)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/374579

相关文章

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知,2024年AMC10美国数学竞赛的报名还有两周,正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间,认真备考,最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢?做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。

如何打造个性化大学生线上聊天交友系统?Java SpringBoot Vue教程,2025最新设计思路

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 | SpringBoot/SSM Python实战项目 | Django 微信小程序/安卓实战项目 大数据实战项目 ⚡⚡文末获取源码 文章目录

智能工厂程序设计 之1 智能工厂都本俱的方面(Facet,Aspect和Respect)即智能依赖的基底Substrate 之1

Q1、昨天分别给出了三个智能工厂的 “面face”(里面inter-face,外面outer-face和表面surface) 以及每个“面face” 各自使用的“方”(StringProcessor,CaseFilter和ModeAdapter)  。今天我们将继续说说三个智能工厂的“方面” 。在展开之前先看一下三个单词:面向facing,取向oriented,朝向toword。理解这三个词 和

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区

2024 年高教社杯全国大学生数学建模竞赛 C 题 农作物的种植策略 参考论文 无水印

持续更新中,2024年数学建模比赛思路代码论文都会发布到专栏内,只需订阅一次!  完整论文+代码+数据结果链接在文末!  订阅后可查看参考论文文件 第一问 1.1 问题重述 这个问题围绕的是华北山区的某乡村,在有限的耕地条件下,如何制定最优的农作物种植策略。乡村有 34 块露天耕地和 20 个大棚,种植条件包括粮食作物、蔬菜、水稻和食用菌。除了要考虑地块的面积、种植季节等,还要确保

红旗EQM换电连接器哪家生产

红旗EQM换电连接器概述 红旗EQM换电连接器是针对红旗品牌电动汽车设计的一种快速更换电池的装置。它允许用户在短时间内完成电池的更换,从而提高电动车的使用效率和便捷性。接下来,我们将详细探讨红旗EQM换电连接器的相关操作步骤、所需工具以及最新的相关信息。   红旗EQM换电连接器操作步骤 根据搜索结果,红旗EQM换电连接器的具体操作步骤如下: 断开电源:在进行任何操作之前,确

2024年全国大学生数学建模A题借鉴论文

问题  1: 舞龙队的动态位置与速度计算 1. **螺旋线的几何建模**:根据题目描述,舞龙队沿着等距螺旋线前进。螺旋线的螺距为 55 cm, 需根据极坐标公式确定每节板凳的位置。 -  极坐标螺旋线方程:\( r = a + b\theta \), 其中  \( b \)  是螺距, 可以利用该方程计算 每秒舞龙队的各个节数的坐标。 2. **速度计算**:给定龙头的行进速度为 1 m/s ,