HDU - 3874Necklace(线段树离线查询)

1448•纯粹素数 纯粹素数是这样定义的:一个素数,去掉最高位,剩下的数仍为素数,再去掉剩下的数的最高位,余下的数还是素数。对于每一个数(无论质数合数)x,筛掉所有小于x最小质因子的质数乘以x的数。但我们知道,我们选择的那个质数必须小于那个合数的最小质因子。p3,因为p2>p1,所以这样是筛不到的。唯一会筛的是第一种:p1和p2*p3。c,s肯定小于刚才那个合数,说明肯定对于它已经筛过,然后a肯定小于s,因为s=b。p3,并且保证p1<p2<p3。我们知道,筛掉这个合数的机会有:p1和p2。c,并且a是最小的因子。 阅读详情

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

题目大意就是要求给定区间的数的和,但是区间内相同的数只能加一次,所以要用到离线查询

我也是今天才了解的,学长之前讲过但我忘了,真是羞愧

 离线查询大概就是两步,先弄个结构体数组储存这些查询,然后可以对这些查询进行操作,这个问题需要用到排序操作,有点贪心的感觉

将查询以右端点的大小从小到大排序(存储的时候记得保存该查询的编号),然后出现过的点因为大小<1000000,所以可以开个vis数组来保存它的上一个出现位置

然后持续更新就好

代码

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
#define ls o<<1
#define rs o<<1|1
#define lson L,mid,ls
#define rson mid+1,R,rs
#define mdzz int mid=(L+R)>>1;
int N,M;
long long tree[200005];        //不用long long 就WA的
int s[50005];
int vis[1000005];
long long ans[200003];
struct node
{
    int l,r,t;
    bool operator <(const node &a)const
    {
        return a.r>r;
    }
}q[200003];
void pushup(int o){
    tree[o]=tree[ls]+tree[rs];
}
void update(int p,int L,int R,int o,int v){ //点修改
    if(L==R){
        tree[o]+=v;
        return;
    }
    mdzz;
    if(p<=mid) update(p,lson,v);
    else update(p,rson,v);
    pushup(o);
}
long long query(int l,int r,int L,int R,int o){//[l,r]区间询问
    if(r>=R&&l<=L) return tree[o];
    mdzz;
    long long ans=0;
    if(l<=mid)
        ans+=query(l,r,lson);
    if(r>mid)
        ans+=query(l,r,rson);
    return ans;
}
int main()
{
    int T;
    scanf("%d",&T);
    int a,b;
    while(T--)
    {
        memset(vis,0,sizeof vis);
        memset(tree,0,sizeof tree);
        scanf("%d",&N);
        for(int i=1;i<=N;i++)scanf("%d",&s[i]);

        scanf("%d",&M);
        for(int i=1;i<=M;i++)
        {
            scanf("%d%d",&q[i].l,&q[i].r);    //储存查询及其编号
            q[i].t=i;
        }
        sort(q+1,q+M+1);
        int p=1;                              //p代表当前遍历区间位置
        for(int i=1;i<=M;i++)
        {
            while(p<=q[i].r)
            {
                if(vis[s[p]])                 //之前有这个值,就将之前这个值出现的位置的点改为0,意思就是说在那个位置的时候不加这个值,而是在现在这个位置加
                    update(vis[s[p]],1,N,1,-s[p]); //不需要担心之前区间的答案会被修改,因为while循环一次是在一个查询区间内操作,若有相同值则上述处理不影响答案
                vis[s[p]]=p;                     //若两个区间有这个相同的值,那么前一个处理的区间已经在while循环外面保存好答案了,随便改,错了算我输hhh
                update(p,1,N,1,s[p]);
                p++;
            }
            ans[q[i].t]=query(q[i].l,q[i].r,1,N,1);  //这样输出的时候就是按查询顺序的
        }
        for(int i=1;i<=M;i++)printf("%lld\n",ans[i]);

    }
    return 0;
}




纯JS实现SM3加密算法(兼容IE浏览器) 纯JS实现SM3加密,IE、谷歌、火狐等浏览器可以直接使用。 阅读详情

相关推荐

魔百和CM211-1刷Armbian全流程:从安卓盒子到Linux服务器的完美变身

本文详细介绍了如何将魔百和CM211-1机顶盒刷入Armbian系统,实现从安卓盒子到Linux服务器的完美变身。涵盖硬件兼容性验证、固件选择、刷机流程、系统优化及常见问题解决,特别适合技术爱好者低成本搭建家庭NAS或开发环境。

weixin_30329623的博客 235

HDU 3874 Necklace(树状数组离线处理)

HDU 3874 Necklace 题目链接 同HDU3333,链接 代码: #include #include #include #include using namespace std; const int N = 50005; const int M = 200005; typedef long long ll; int t, n, a[N]; map g

Remilia's 804

ros1 ubuntu22.04 安装教程

ROS1 ubuntu22.04 安装教程

autolabor的博客 9193

hdu3874(离线思想+线段树)

Necklace Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2034    Accepted Submission(s): 733 Problem Description Mery has a beautiful

晓风残月xj 1009

国产FPGA逆袭!深度评测复旦微RFVU3P5G核心板在相控阵雷达中的表现

本文深度评测了复旦微RFVU3P5G核心板在相控阵雷达中的实战表现。该核心板凭借射频直采架构、高采样率ADC/DAC及丰富的DSP资源,在多通道同步精度、动态范围及系统稳定性等关键指标上表现出色,展现了国产FPGA在高端雷达应用中的硬核实力与供应链自主价值。

b0c1d2的博客 718

Redis TLS 加密传输实战:从证书生成到安全配置

本文详细介绍了为Redis启用TLS加密传输的完整实战流程。从阐述TLS加密的必要性开始,逐步指导读者生成自签名CA和服务器证书,并深入解析Redis服务端的核心安全配置,包括端口设置、认证模式与性能优化。最后,提供了主流客户端连接示例及生产环境下的排错与运维最佳实践,帮助构建安全的Redis通信通道。

weixin_29274969的博客 515

HDU 3874 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

__ElemenT 880

EFR32BG22 Thunderboard开发板 使用SPI 读取加速度计

Simplicity Studio v5 创建Silicon Labs蓝牙SoC EFR32BG22 Thunderboard模块的加速度计工程,模块上有一个ICM-20648 6轴运动跟踪设备,集成3轴加速度计和3轴陀螺仪功能,使用SPI接口跟EFR32BG22芯片连接。 我尽量以图片的形式展示(少打字): 将EFR32BG22的Thunderboard模块通过USB线插入到电脑,打开Simplicity Studio v5软件。 下面看重点: 点击搜索到的IO Stream: USART,点击Ins

qq_25727979的博客 1493

HDU 3874 Necklace

HDU 3874 Necklace线段树,离线询问题意给一个数组,m个询问。每次询问一个区间,求区间内数的和,重复数只计算一次。思路离线询问后按右端点排序,从左往右扫数字,开个hash记录上次该数出现的位置。线段树模拟数组,出现就在位置上放数,没出现就置零,统计区间和。这样每次扫到一个数,如果他没出现,就放到线段树上;如果他出现了,那么把它从上次出现的位置删掉,放到新的位置,更新hash数组。每次询

P.H.S 260

最邻近点对问题(Closest-Pair Problem):二维的分治解法详解

低维时,最邻近点对问题可以利用分治求解。但是网络上相关资料良莠不齐,对于3维甚至难有有价值的参考。最近恰巧梳理了123维最邻近点对问题的相关知识,故在此分享。这是该系列的第二篇,介绍二维情况的分治解法。

Carl_Rabbit的博客 1万+

NOTE: When using the `ipython kernel` entry point, Ctrl-C will not work.解决方案

本文主要介绍了NOTE: When using the `ipython kernel` entry point, Ctrl-C will not work.解决方案,希望能对使用jupyter notebook的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

线段树 hdu3874 Necklace

这题有两种方法,,一种是莫队算法,,感觉莫队算法是一眼就能看出来可以用的,,只是写起来也略有麻烦 另外一种就是线段树,话说这题线段树写起来超级爽不知道为何 首先询问需要离线,然后按照右区间从大到小排序 pre[i]表示上一个数字i出现的位置 然后从1开始枚举i到n,每一次在区间[pre[A[i]]+1,i]上利用线段树成段更新加上A[i] 因为pre[A[i]]是上一个数字出现的

qwb的博客 1009

Python 爬虫实战:全面解析雪球网用户投资组合数据采集

本文介绍了如何使用 Python 爬虫技术,抓取雪球网用户的投资组合信息。通过模拟登录、解析页面内容等步骤,获取了用户的持仓数据。未来,可以进一步探索以下方向:

2201_76125261的博客 1302

hdu3874Necklace(线段树或者BIT + 离线处理)

->题目请戳这里 题目大意:给n个数,求任意区间不相同数字之和。 题目分析:n个数是给定的,不会变了,区间也是给定的。由于要求任意区间不重复数字之和,那就和这道super mario非常类似了,我们可以离线处理所有询问。由于要求不重复数字之和,我们把询问区间按右断点排序,这样从左往右扫描数列,如果以前没有出现的数字,直接插入,如果出现了,将这个数字上次出现的位置删去,在当前位置重新插入这个数。

ophunter的专栏 1141

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

HDU 3874-Necklace【线段树离线】

题意:给你n个数和m个询问,每次询问区间[l, r] 里不相同的数的和。 思路:在线复杂度是略大的,所以考虑离线去做。将区间按右端点排序,然后从左端开始遍历,每次对于之前出现过的节点将之前的节点改为0,然后记录新节点位置并更新,对于之前没有出现过的节点则直接更新就行了。 #include <bits/stdc++.h> using namespace std; typedef l...

独钓门前月 359

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

hdu 3874 Necklace

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3874 题目大意:求区间和,但相同的数只加一次. 题目思路: 这题直接用线段树是做不出来,会退化成O(nlogn),除非线段树中不同的数只存一个,这样就变成最简单的区间求和,用树状数组也能做.但是我们需要边建树边询问,遇到树中有相同的数时,先把树中的数删档,再在当前位置添加该数,之后在判断

Go.To.AC的专栏 895

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

[树状数组&线段树]HDU3874 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 b

童凌的技术博客 649

HDU 3874 Necklace(线段树啊 单点更新 区间求和)

HDU 3874 Necklace(线段树啊 单点更新 区间求和)

775

【题解】[hdu3874]Necklace

题目大意:给出n个序列,和m个查询每个查询为1个区间[l,r],要求对于每个查询,输出这个区间内不重复的数的和 (比如说区间内的数为 3 4 4 5,和就为12,因为对于相同的数只会统计一次) 反正这道题我第一眼看到完全是蒙的。。。后来问lz神,讲了一会才把我讲懂。。。我太弱了啊 这道题是这么做的。。。在线操作不行,考虑离线,先读入所有查询区间,然后对于值相同的数,把相邻的两个数的位

zsl的学习博客 1003

HDU-3874 Necklace(线段树)

Necklace Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4525    Accepted Submission(s): 1550 Problem Description Mery has a beautiful

十分残念的博客 555

Necklace HDU - 3874 (线段树/树状数组 + 离线处理)

Necklace HDU - 3874 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...

weixin_30832983的博客 143

HDU 3874 Necklace (树状数组 | 线段树 的离线处理)

Necklace Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2083    Accepted Submission(s): 747 Problem Description Mery has a beautiful neckla...

weixin_33981932的博客 223

HDU 3874 Necklace 区间查询的离线操作

题目: http://acm.hdu.edu.cn/showproblem.php?pid=3874 对需要查询的区间按右端点排序,然后从左到右依次加入序列中的元素,同时更新,更新的方法是,把上一次出现a[i]值的点变为0,这一次a[i]值的点(即 i)变为a[i],这样保证了前i个元素中只存在一个等于a[i]值得元素,那为什么这样不会影响后面的查询呢? 因为是处理到i点,则把右边界...

weixin_30463341的博客 158

hdu 3874 Necklace 线段树

跟hdu3333相同,改下N和Q数据范围即可 #include #include #include #include using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int N=50005; const int Q=200005; typedef long long LL; int n,t

dimhat的专栏 608

HDU-3874 Necklace 线段树+离线

  题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3874   比较简单的题,题意也好懂。   先O(n)求每个数左边第一次出现的与他相同的数的位置l[i]。对询问按照y从小大排序,然后按照从左到右的顺序来跟新点,当前点为i,那么删掉l[i],加入点i,然后遇到询问求和。 1 //STATUS:C++_AC_2593MS_10024KB...

weixin_30398227的博客 100

hdu 3874 Necklace(离线操作+树状数组或线段树)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3874 解题思路:         我们可以先离线处理。先读入所有的查询,然后对所有查询按区间右端点从小到大排序,再依次进行处理,这样可以保证后面的操作不会改变前面的查询结果。使原序列中的数据一个一个的加入到线段树中,若某个数已经在序列中,则在最近出现的位置删除该数,这样就能保证每个数任意时

piaocoder 659
上一篇: HDU - 3577 Fast Arrangement (线段树区间修改及查询模板题)
下一篇: HDU - 3333Turing Tree (线段树离线查询+离散化)
T__TSZ
博客等级 码龄10年 2粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值