hdu 3874 树状数组+离线处理

2024-05-28 04:48

本文主要是介绍hdu 3874 树状数组+离线处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://acm.hdu.edu.cn/showproblem.php?pid=3874


跟上一题一样http://blog.csdn.net/u011026968/article/details/38542227,我相当于默写一遍上一题的代码。。。。

上次出现的问题在这里总结下:
1、lower_bound()返回的是指针,为了变为下标,需要减去数组首地址----当然这个下标是从0开始的,树状数组里下标从1开始,所以再多加个1

2、离散化的方法:
以前我的做法是:http://blog.csdn.net/u011026968/article/details/38527151

就是lisan[i]=i  对lisan[]数组按照num[i]数组进行间接排序,然后lisan[i]=k,表示第i小的数在num的下标为k,再做一次处理,d[lisan[i]]=i,相当于把num中下标为k的数变成了i,而且i范围是1~n  (n是数的个数),就达到了压缩区间的目的。但是今天发现,如果原来的数组里面有重复元素,那么这样处理之后,新的数组没有重复元素了o(╯□╰)o

对于hdu3874和hdu3333这种排除重复元素的题,当然这种离散化的方法就不对了

这道题不需要离散化,,,

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;#define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)const int MAXN =  50000+100;
struct Query
{int l,r;int id;bool operator < (const Query &c)const{return r<c.r;}
}q[200000 + 100];ll c[MAXN],ans[200000 + 100];
ll num[MAXN],bi[MAXN];
int last[MAXN];
int N;inline int lowbit(int i){return i&(-i);}void add(int x, int v)
{while(x<=N){c[x]+=v;x+=lowbit(x);}
}
ll sum(int i)
{ll ret=0;while(i>0){ret+=c[i];i-=lowbit(i);}return ret;
}int main()
{//IN("hdu3874.txt");int ncase;int Q,l,r;scanf("%d",&ncase);while(ncase--){scanf("%d",&N);CL(c,0);CL(last,0);for(int i=1;i<=N;i++){scanf("%I64d",&num[i]);bi[i]=num[i];}sort(bi+1,bi+1+N);scanf("%d",&Q);for(int i=1;i<=Q;i++){scanf("%d%d",&q[i].l,&q[i].r);q[i].id=i;}sort(q+1,q+1+Q);int qu=1;for(int i=1;i<=N;i++){int pos=lower_bound(bi+1,bi+1+N,num[i])-bi;if(last[pos]){add(last[pos],-num[i]);last[pos]=i;}add(i,num[i]);last[pos]=i;while(q[qu].r == i && qu<=Q){ans[q[qu].id]=sum(i)-sum(q[qu].l-1);qu++;}}for(int i=1;i<=Q;i++)printf("%I64d\n",ans[i]);}return 0;
}



这篇关于hdu 3874 树状数组+离线处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

Python处理函数调用超时的四种方法

《Python处理函数调用超时的四种方法》在实际开发过程中,我们可能会遇到一些场景,需要对函数的执行时间进行限制,例如,当一个函数执行时间过长时,可能会导致程序卡顿、资源占用过高,因此,在某些情况下,... 目录前言func-timeout1. 安装 func-timeout2. 基本用法自定义进程subp

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面