B.Galahad

链接:https://ac.nowcoder.com/acm/contest/1084/B
来源:牛客网

题目描述

魔女要测试骑士的能力,要求他维护一个长度为 的序列,每次要询问一个区间的和。

但是魔女觉得太简单了,骑士能轻松记住 个数作为前缀和。

于是,魔女要求他回答一个区间的和,但如果某一个数在这个区间出现了多次,这个数只能被计算一次。

输入描述:

第一行两个整数n,m表示数列长度和询问个数。

第二行n个整数,第i个整数为a(i)
(1≤a(i)≤500 000),表示序列中的第i项。

接下来m行,每行两个整数L,R,表示询问的区间。

输出描述:

输出m行,每行一个整数表示这次询问的答案。

分析:

看到这题的时候感觉见过但是没想起来。
其实就是这道题的变形:求区间内不同数字的个数

每次操作改变量的是a(i)而不是1
具体原理那边写了这里就不写了

ps:
这题莫队tle

code:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
#define ll long long
const int maxm=5e5+5;
struct Node{int l,r,id;bool operator<(const Node a){return r<a.r;}
}q[maxm];
int a[maxm];
int mark[maxm];
ll c[maxm],res[maxm];
int n,m;
int lowbit(int i){return i&-i;
}
void add(int i,int t){while(i<=n){c[i]+=t;i+=lowbit(i);}
}
ll ask(int i){ll ans=0;while(i){ans+=c[i];i-=lowbit(i);}return ans;
}
signed main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}for(int i=1;i<=m;i++){scanf("%d%d",&q[i].l,&q[i].r);q[i].id=i;}sort(q+1,q+1+m);int last=1;for(int i=1;i<=m;i++){for(int j=last;j<=q[i].r;j++){if(mark[a[j]]){add(mark[a[j]],-a[j]);}mark[a[j]]=j;add(mark[a[j]],a[j]);}last=q[i].r+1;res[q[i].id]=ask(q[i].r)-ask(q[i].l-1);}for(int i=1;i<=m;i++){printf("%lld\n",res[i]);}return 0;
}

牛客练习赛52 B.Galahad (树状数组)相关推荐

  1. 牛客练习赛52 B Galahad (树状数组)

    题目链接:https://ac.nowcoder.com/acm/contest/1084/B 题意 5e5的区间,5e5个询求[l,r]区间内出现过的数的和 思路 1s时限,莫队显然会T 我们可以将 ...

  2. 牛客练习赛69E-子串【树状数组】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/7329/E 题目大意 给出一个nnn的排列,求有多少个区间[l,r][l,r][l,r]使得最大值是rrr,最 ...

  3. 牛客 - tokitsukaze and Inverse Number(树状数组+逆序对定理)

    题目链接:点击查看 题目大意:给出一个长度为 n 的排列 a,需要执行 q 次操作,每次操作会将区间 [ l , r ] 内的数循环右移 k 次,现在需要回答每次操作后排列的逆序对数,只需要回答奇偶即 ...

  4. 牛客竞赛数据结构专题班树状数组、线段树练习题

    F.little w and Discretization 题意:找区间[l,r]内离散化后和原来的值不同大小的数的个数 思路:先求区间mex,同时记录区间有多少个数,再 用区间长度减去(区间内小于m ...

  5. 牛客练习赛52 | C | [烹饪] (DP,裴蜀定理,gcd)

    牛客练习赛52 C 烹饪 链接:https://ac.nowcoder.com/acm/contest/1084/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...

  6. 牛客练习赛52.Galahad(树状数组维护区间不相同数的和)

    链接:https://ac.nowcoder.com/acm/contest/1084/B 来源:牛客网 Galahad 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K ...

  7. 牛客练习赛52 B:Galahad(树状数组维护区间不同元素和(个数))

    [题目] 查询区间和,如果区间元素重复出现则计数一次. [题解] 按区间的右端点建立树状数组,维护区间[1,R]的每个元素的最右位置.按查询区间的右端点排序,依次处理,每次更新当前值的最右位置即可. ...

  8. 牛客练习赛52 BGalahad 树状数组

    传送门 题意: 求一个区间的和,但如果某一个数在这个区间出现了多次,这个数只能被计算一次. 官方题解:按右端点从小到大排序.建立树状数组ccc,维护贡献的前缀和. 由于权值ai 满足1≤ai≤500  ...

  9. 计蒜客-青出于蓝胜于蓝 dfs+树状数组

    题目描述: 武当派一共有 n人,门派内 n 人按照武功高低进行排名,武功最高的人排名第 1,次高的人排名第 2,... 武功最低的人排名第 n.现在我们用武功的排名来给每个人标号,除了祖师爷,每个人都 ...

最新文章

  1. Java项目:晚会抽奖系统(java+Jdbc+Servlet+Ajax+mysql)
  2. java 实现excel样式设置(居中、字体、大小、换行、合并行,列宽、指定特定字符串样式等)
  3. python爬虫教程蝴蝶汤_Python 爬虫十六式 - 第五式:BeautifulSoup-美味的汤
  4. Eclipse运行tomcat失败
  5. ue4如何恢复初始状态_UnrealEngine4初始化流程
  6. Java核心技术(基础知识一)
  7. 路由器Telnet及ACL配置
  8. 计算机系新春祝福语,春节的祝福语
  9. echarts pie 饼图 border宽度
  10. 无人驾驶车辆控制(三):纯跟踪算法(Pure Pursuit)
  11. excel入门/常用的技巧
  12. vue-cli中配置gzip压缩
  13. C# 对JS解析AJX请求JSON并绑定到html页面的一些心得
  14. 体育这事,除了抢IP、赞助,就真不能干点其他啥了?
  15. 户外工业级4G路由器与家用WiFi路由器的区别
  16. 网件 设置为ap_如何设置Netgear Arlo Pro相机系统
  17. AD8232心电数据处理所用到的相关知识
  18. 考拉解析网站iPhone借助Documents保存视频
  19. 百度持续交付新产品的改造之路
  20. 计算机软件实习项目二 —— 贪吃蛇游戏 (代码实现) 12-16

热门文章

  1. linux虚拟机和电脑ping通(可上网)
  2. 我是如何接单的! 全网最强的接单 避坑指南 都在这里!
  3. WeCenter 与 UCenter 对接
  4. graphite安装笔记
  5. forEach,$.each()以及$().each()的比较
  6. JDBC-----什么是JDBC
  7. android RemoteViews用法
  8. esp8266介绍和使用
  9. e1000网卡驱动第二天_3
  10. 13、hive在启动beeline客户端时报错:User: xxx is not allowed to impersonate xxx