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

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

MyBatis延迟加载的处理方案

《MyBatis延迟加载的处理方案》MyBatis支持延迟加载(LazyLoading),允许在需要数据时才从数据库加载,而不是在查询结果第一次返回时就立即加载所有数据,延迟加载的核心思想是,将关联对... 目录MyBATis如何处理延迟加载?延迟加载的原理1. 开启延迟加载2. 延迟加载的配置2.1 使用

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

Python中处理NaN值的技巧分享

《Python中处理NaN值的技巧分享》在数据科学和数据分析领域,NaN(NotaNumber)是一个常见的概念,它表示一个缺失或未定义的数值,在Python中,尤其是在使用pandas库处理数据时,... 目录NaN 值的来源和影响使用 pandas 的 isna()和 isnull()函数直接比较 Na

详解Python中通用工具类与异常处理

《详解Python中通用工具类与异常处理》在Python开发中,编写可重用的工具类和通用的异常处理机制是提高代码质量和开发效率的关键,本文将介绍如何将特定的异常类改写为更通用的ValidationEx... 目录1. 通用异常类:ValidationException2. 通用工具类:Utils3. 示例文

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que