树状数组练习--Necklace(树状数组+离线处理)

2023-11-06 22:38

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

原题:

Problem Description
Mery has a beautiful necklace. The necklace is made up of N magic balls. Each ball has a beautiful value. The balls with the same beautiful value look the same, so if two or more balls have the same beautiful value, we just count it once. We define the beautiful value of some interval [x,y] as F(x,y). F(x,y) is calculated as the sum of the beautiful value from the xth ball to the yth ball and the same value is ONLY COUNTED ONCE. For example, if the necklace is 1 1 1 2 3 1, we have F(1,3)=1, F(2,4)=3, F(2,6)=6.

Now Mery thinks the necklace is too long. She plans to take some continuous part of the necklace to build a new one. She wants to know each of the beautiful value of M continuous parts of the necklace. She will give you M intervals [L,R] (1<=L<=R<=N) and you must tell her F(L,R) of them.

Input
The first line is T(T<=10), representing the number of test cases. For each case, the first line is a number N,1 <=N <=50000, indicating the number of the magic balls. The second line contains N non-negative integer numbers not greater 1000000, representing the beautiful value of the N balls. The third line has a number M, 1 <=M <=200000, meaning the nunber of the queries. Each of the next M lines contains L and R, the query.

Output
For each query, output a line contains an integer number, representing the result of the query.

Sample Input
  
2 6 1 2 3 4 3 5 3 1 2 3 5 2 6 6 1 1 1 2 3 5 3 1 1 2 4 3 5

Sample Output
  
3 7 14 1 3 6

题目链接:http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?cid=11842&pid=1006&ojid=0&hide=1&problem=Problem%20F

题意:

给出n个数,给出m个区间,让求这一区间的元素和。

如果有一样的数字,只算一遍。

例如Sample 2,1 2 区间段和是1.

思路:求区间段和,首先想到的就是用树状数组。那么怎么考虑一样的数字的问题呢?就要用到离线处理了。首先将所求区间和进行储存并记录其出现的初始位置。然后对所有区间按照右端点进行排序。然后用一个变量进行记录。如果该元素之前出现过,那么在之前位置往后减去该元素,然后再在当前位置后加上该元素。直到区间结束,更新过后求结果。对结果进行保存。

源代码:

/*1006离线处理。先将区间保存,然后按照右端点升序排列。离线处理要记录初始的区间位置然后从头开始查找。若该点的元素出现过,则从原来位置开始减去该元素。若没有出现过,则加上该元素。最后求和。*/
#include <iostream>
#include <cstring>
#include <algorithm>
#include <stdio.h>
#include <vector>
#define MAX 1000000
using namespace std;
long long C[MAX];
long long a[MAX];
long long flag[MAX];
long long jieguo[MAX];
struct Qujian
{int i;int j;int id;
}qujian[MAX];
bool cmp(Qujian a,Qujian b)
{return a.j < b.j;
}
long long lowbit(long long x)
{return x & (-x);
}
long long getsum(long long x)
{long long sum = 0;while (x > 0){sum += C[x];x -= lowbit(x);}return sum;
}
void add(long long x,long long v)
{while (x < MAX){C[x] += v;x += lowbit(x);}
}
int main()
{int n;scanf("%d",&n);while (n--){int m;memset(flag,0,sizeof(flag));memset(C,0,sizeof(C));memset(a,0,sizeof(a));scanf("%d",&m);for (int i = 1; i <= m; i++)scanf("%lld",&a[i]);int k;scanf("%d",&k);for (int p = 1; p <= k; p++){scanf("%d%d",&qujian[p].i,&qujian[p].j);qujian[p].id = p;}sort(qujian+1,qujian+k+1,cmp);//for (int i = 1; i <= k; i++)//{//    cout << qujian[i].i << endl << qujian[i].j << endl;//    cout << qujian[i].id << endl;//}long long flag1 = 1;for (int i = 1; i <= k; i++){while (flag1 <= qujian[i].j){long long b;b = a[flag1];if (flag[b])add(flag[b],-b);add(flag1,b);flag[b] = flag1;flag1++;}//cout << getsum(qujian[i].j) << endl << getsum(qujian[i]. i - 1)<< endl;jieguo[qujian[i].id] = getsum(qujian[i].j) - getsum(qujian[i].i-1);}for (int i = 1; i <= k; i++)printf("%lld\n",jieguo[i]);}return 0;
}



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



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

相关文章

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

Python结合requests和Cheerio处理网页内容的操作步骤

《Python结合requests和Cheerio处理网页内容的操作步骤》Python因其简洁明了的语法和强大的库支持,成为了编写爬虫程序的首选语言之一,requests库是Python中用于发送HT... 目录一、前言二、环境搭建三、requests库的基本使用四、Cheerio库的基本使用五、结合req

使用Python处理CSV和Excel文件的操作方法

《使用Python处理CSV和Excel文件的操作方法》在数据分析、自动化和日常开发中,CSV和Excel文件是非常常见的数据存储格式,ython提供了强大的工具来读取、编辑和保存这两种文件,满足从基... 目录1. CSV 文件概述和处理方法1.1 CSV 文件格式的基本介绍1.2 使用 python 内

如何使用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 使用