蓝桥杯 2014 C++B(5) Log大侠 线段树 区间修改

2024-04-05 23:48

本文主要是介绍蓝桥杯 2014 C++B(5) Log大侠 线段树 区间修改,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

atm参加了速算训练班,经过刻苦修炼,对以2为底的对数算得飞快,人称Log大侠。 一天,Log大侠的好友 drd有一些整数序列需要变换,Log大侠正好施展法力… 变换的规则是: 对其某个子序列的每个整数变为: [log_2 (x) + 1] 其中[] 表示向下取整,就是对每个数字求以2为底的对数,然后取下整。 例如对序列 3 4 2 操作一次后,这个序列会变成 2 3 2。drd需要知道,每次这样操作后,序列的和是多少。

【输入格式】 第一行两个正整数 n m 。 第二行 n 个数,表示整数序列,都是正数。 接下来 m 行,每行两个数 L R 表示 atm这次操作的是区间 [L, R],数列序号从1开始。
【输出格式】 输出 m 行,依次表示 atm 每做完一个操作后,整个序列的和。
例如,
输入:
3 3
5 6 4
1 2
2 3
1 3
程序应该输出:
10
8
6

【数据范围】

对于 30% 的数据, n, m <= 10^3
对于 100% 的数据, n, m <= 10^5
资源约定: 峰值内存消耗 < 256M
CPU消耗 < 1000ms 请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意: main函数需要返回0 注意: 只使用ANSI C/ANSI C++
标准,不要调用依赖于编译环境或操作系统的特殊函数。 注意: 所有依赖的函数必须明确地在源文件中 #include ,
不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#define lson p << 1
#define rson p << 1 | 1
using namespace std;
typedef long long LL;const int MAXN = 100010;
int f[MAXN];
LL tree[MAXN<<2];           //注意开long long
int n;void build(int p, int l, int r){if(l == r){scanf("%d",&tree[p]);//省去了a数组return;}int m = (l+r)>>1;	build(p<<1,l,m);build(p<<1|1,m+1,r);tree[p] = tree[lson] + tree[rson];} void updateSome(int p, int l, int r, int tl, int tr){if(r < tl || l > tr)return;if(l == r){//其实这个比较费时 ,但是 这题不知道怎么进行类似懒惰标记的优化 只能在最底层进行更新了tree[p] = f[tree[p]];//这里修改值return;}int m = (l+r) >> 1;if(tl <= m)updateSome(lson,l,m,tl,tr);if(tr > m)updateSome(rson,m+1,r,tl,tr);tree[p] = tree[lson] + tree[rson];}int main()
{int m;scanf("%d%d", &n, &m);build(1, 1, n);    for(int i = 1; i <= MAXN; i++)f[i] = (int)(log2(i) + 1);//这个数组也是个技巧while(m--){int l, r;scanf("%d%d", &l, &r);updateSome(1, 1, n, l, r);printf("%I64d\n", tree[1]);}return 0;
}

这篇关于蓝桥杯 2014 C++B(5) Log大侠 线段树 区间修改的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

C++读写word文档(.docx)DuckX库的使用详解

《C++读写word文档(.docx)DuckX库的使用详解》DuckX是C++库,用于创建/编辑.docx文件,支持读取文档、添加段落/片段、编辑表格,解决中文乱码需更改编码方案,进阶功能含文本替换... 目录一、基本用法1. 读取文档3. 添加段落4. 添加片段3. 编辑表格二、进阶用法1. 文本替换2

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返

Nginx屏蔽服务器名称与版本信息方式(源码级修改)

《Nginx屏蔽服务器名称与版本信息方式(源码级修改)》本文详解如何通过源码修改Nginx1.25.4,移除Server响应头中的服务类型和版本信息,以增强安全性,需重新配置、编译、安装,升级时需重复... 目录一、背景与目的二、适用版本三、操作步骤修改源码文件四、后续操作提示五、注意事项六、总结一、背景与

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数