hdu 5975 树状数组原理题(16亚洲区域赛大连站)

2024-03-30 05:58

本文主要是介绍hdu 5975 树状数组原理题(16亚洲区域赛大连站),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

lowbit[i]表示的其实就是i的二进制表示中,不为0的最低位;对于询问1的区间[L,R],很好处理;
ans=cal(R)-cal(L-1);
cal(x)表示集合1到集合x,这x个集合一共加进去的数的个数;
加入集合k的数,根据题目给的公式可以推导出就是2^lowbit(k),即2的整数次幂;
所以直接枚举2的整数次幂即可在log(x)的时间复杂度里快速得出cal(x)答案对于询问2,先看一下以下几点:1)
当i为2的整数次幂,C[i]记录的是A[1]到A[i]的前i项和2)
C[i]记录的是A[i-lowbit(i)+1]到A[i]的lowbit(i)项和,第1个特点就是其中一个特例8前面的数1到7在进行,i+=lowbit(i)过程中都会到达8,这之后i+=lowbit(i) 相当于就不断乘2;[9,11]区间里的数i+=lowbit(i)也会先到达12,再16,之后i+=lowbit(i) 也是相当于不断乘2;这样C[i]有另一种理解方式,记录的是A[k+1]到A[i]的和,其中k表示i之前lowbit(k)大于lowbit(i)的最大值;对于C[12]来说k就是8;  对于C[14]来说k就是123)
有了第2点作为基础,要记录A数组的前i项和只需要
int answer=0;
while(i>0)
{answer+=C[i];i-=lowbit(i);
}
return answer;
4)
对于i和i+lowbit(i)之间的数(不包括这两个本身)m,lowbit(m)必定小于lowbit(i)
并且,假设C[m]记录的是区间[L,R]的所有A[ ]值和,那么必有i<L<=R<i+lowbit
5)
有了第4点的基础
对于A[k],它的值被哪些C[i]加进去了
可以这么写
int i=k;
while(i<=N)
{sum++;i=i+lowbit(i);//对于这些i,C[i]包括A[k]
}
LL cal(LL x)
{LL ans=0;for(LL i=0;(1LL<<i)<=x;++i)ans+=(x/(1LL<<i)-x/(1LL<<(i+1)))*(1LL<<i);return ans;
}
int main()
{LL n,q,ans,x,L,R;while(~scanf("%lld%lld",&n,&q)){int ob;while(q--){ans=0;scanf("%d",&ob);if(ob==1){scanf("%lld%lld",&L,&R);ans=cal(R)-cal(L-1);}else{scanf("%lld",&x);while(x<=n){ans++;x+=lowbit(x);}}printf("%lld\n",ans);}}return 0;
}



这篇关于hdu 5975 树状数组原理题(16亚洲区域赛大连站)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

MySQL的隐式锁(Implicit Lock)原理实现

《MySQL的隐式锁(ImplicitLock)原理实现》MySQL的InnoDB存储引擎中隐式锁是一种自动管理的锁,用于保证事务在行级别操作时的数据一致性和安全性,本文主要介绍了MySQL的隐式锁... 目录1. 背景:什么是隐式锁?2. 隐式锁的工作原理3. 隐式锁的类型4. 隐式锁的实现与源代码分析4

MySQL中Next-Key Lock底层原理实现

《MySQL中Next-KeyLock底层原理实现》Next-KeyLock是MySQLInnoDB存储引擎中的一种锁机制,结合记录锁和间隙锁,用于高效并发控制并避免幻读,本文主要介绍了MySQL中... 目录一、Next-Key Lock 的定义与作用二、底层原理三、源代码解析四、总结Next-Key L

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.