牛客练习赛52 B题【树状数组维护区间和{查询区间和,如果区间元素重复出现则计数一次}】补题ing
【题目】
查询区间和,如果区间元素重复出现则计数一次。
链接:https://ac.nowcoder.com/acm/contest/1084/B
【题解】
将询问按r排序,维护每个数最后出现的位置,并用树状数组维护前缀和即可
AC代码:
#include<bits/stdc++.h> using namespace std;
#define int long long
#define lowbit(x) (x&(-x))
#define N 500009
int n,m;
int arr[N];
int ans[N];
int mp[N];
struct str{
int l,r,id;
}st[N];
int c[N];
inline void update(int x,int v){
for(int i=x;i<=n;i+=lowbit(i))
c[i]+=v;
}
inline int getsum(int x){
int res=;
for(int i=x;i;i-=lowbit(i))
res+=c[i];
return res;
}
bool cmp(str a,str b){
return a.r<b.r;
}
signed main(){
cin>>n>>m;
memset(mp,,sizeof(mp)); for(int i=;i<=n;i++){
scanf("%lld",&arr[i]);
}
for(int i=;i<=m;i++){
scanf("%lld%lld",&st[i].l,&st[i].r);
st[i].id=i;
}
sort(st+,st++m,cmp);
int now=;
for(int i=;i<=m;i++){
for(int j=now;j<=st[i].r;j++){
if(mp[arr[j]]){
update(mp[arr[j]],-arr[j]);
} update(j,arr[j]);
mp[arr[j]]=j;
}
now=st[i].r+;
ans[st[i].id]=getsum(st[i].r)-getsum(st[i].l-);
}
for(int i=;i<=m;i++){
printf("%lld\n",ans[i]);
}
return ;
}
如果要查询区间不同元素个数:则将代码改为:
#include<bits/stdc++.h> using namespace std;
#define int long long
#define lowbit(x) (x&(-x))
#define N 500009
int n,m;
int arr[N];
int ans[N];
int mp[N];
struct str{
int l,r,id;
}st[N];
int c[N];
inline void update(int x,int v){
for(int i=x;i<=n;i+=lowbit(i))
c[i]+=v;
}
inline int getsum(int x){
int res=;
for(int i=x;i;i-=lowbit(i))
res+=c[i];
return res;
}
bool cmp(str a,str b){
return a.r<b.r;
}
signed main(){
cin>>n>>m;
memset(mp,,sizeof(mp)); for(int i=;i<=n;i++){
scanf("%lld",&arr[i]);
}
for(int i=;i<=m;i++){
scanf("%lld%lld",&st[i].l,&st[i].r);
st[i].id=i;
}
sort(st+,st++m,cmp);
int now=;
for(int i=;i<=m;i++){
for(int j=now;j<=st[i].r;j++){
if(mp[arr[j]]){
update(mp[arr[j]],-);
} update(j,);
mp[arr[j]]=j;
}
now=st[i].r+;
ans[st[i].id]=getsum(st[i].r)-getsum(st[i].l-);
}
for(int i=;i<=m;i++){
printf("%lld\n",ans[i]);
}
return ;
}
牛客练习赛52 B题【树状数组维护区间和{查询区间和,如果区间元素重复出现则计数一次}】补题ing的更多相关文章
- 牛客练习赛52 B Galahad (树状数组)
题目链接:https://ac.nowcoder.com/acm/contest/1084/B 题意 5e5的区间,5e5个询求[l,r]区间内出现过的数的和 思路 1s时限,莫队显然会T 我们可以将 ...
- 牛客第二场-J-farm-二维树状数组
二维树状数组真的还挺神奇的,更新也很神奇,比如我要更新一个区域内的和,我们的更新操作是这样的 add(x1,y1,z); add(x2+1,y2+1,z); add(x1,y2+1,-z); add( ...
- 牛客练习赛47 E DongDong数颜色 (树状数组维护区间元素种类数)
链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...
- 牛客练习赛52 | C | [烹饪] (DP,裴蜀定理,gcd)
牛客练习赛52 C 烹饪 链接:https://ac.nowcoder.com/acm/contest/1084/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...
- LOJ107. 维护全序集【树状数组维护全序集】
题目描述 这是一道模板题,其数据比「普通平衡树」更强. 如未特别说明,以下所有数据均为整数. 维护一个多重集 S ,初始为空,有以下几种操作: 把 x 加入 S 删除 S 中的一个 x,保证删除的 x ...
- 【BZOJ2124】等差子序列 树状数组维护hash值
[BZOJ2124]等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N ...
- 树状数组优化DP 【模拟赛】删区间
哇,难受得一匹. 看到题的一瞬间竟然只想到了\(n^3\)的区间\(DP\) 一.\(40pts\) 设\(f[i][j]\)代表删去\(i\)到\(j\)这一段区间的最小代价和. 然后直接写普通的区 ...
- bzoj 2819 Nim dfn序+树状数组维护区间异或值
题目大意 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略 ...
- [poj3378] Crazy Thairs (DP + 树状数组维护 + 高精度)
树状数组维护DP + 高精度 Description These days, Sempr is crazed on one problem named Crazy Thair. Given N (1 ...
随机推荐
- Linux系列(12)之例行工作调度
你知道工作调度有哪几种吗? 你知道在进行工作调度时需要哪些服务在运行吗? 你知道突发性工作调度的指令at的用法吗? 知道如何管理at的工作调度吗? 知道at指令进行工作调度的原理吗? 知道什么是背景任 ...
- Thinking In Java 4th Chap5 初始化和清理
类的构造器名必须与类名一致,且无返回类型,通过参数类型的不同(即使顺序不同也行)可以重载构造器,也可以以此技巧重载方法 this关键字:表示对“调用方法的那个对象的引用”,也可将当前对象传递给其他方法 ...
- 【Python基础】05_Python中的while循环
1.程序的三大流程介绍 顺序 —— 从上到下,顺序执行 分支 —— 根据条件判断,决定代码的分支 循环 —— 让特定代码执行 2.while 基本语法 while 条件(判断 计数器 是否达到 目标次 ...
- 【01字典树】hdu-5536 Chip Factory
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5536 [题意] 求一个式子,给出一组数,其中拿出ai,aj,ak三个数,使得Max{ (ai+aj ...
- Oracle笔记2
24.复杂查询的三道题 # 案例一:列出与SCOTT从事相同工作的所有员工及部门名称.人数.平均工资 GROUP BY使用限制: 查询语句中没有GROUP BY,则SELECT子句中只能出现统计函数; ...
- oracle练手(一)
练手001 1.列出至少有一个员工的所有部门 select dname from dept where deptno in (select deptno from emp); select dname ...
- 《深入理解 Java 虚拟机》学习 -- Java 内存模型
<深入理解 Java 虚拟机>学习 -- Java 内存模型 1. 区别 这里要和 JVM 内存模型区分开来: JVM 内存模型是指 JVM 内存分区 Java 内存模型(JMM)是指一种 ...
- [Tarjan系列] Tarjan算法求无向图的双连通分量
这篇介绍如何用Tarjan算法求Double Connected Component,即双连通分量. 双联通分量包括点双连通分量v-DCC和边连通分量e-DCC. 若一张无向连通图不存在割点,则称它为 ...
- spring-cloud 学习四 服务网关
API Gateway 服务网关在微服务中是一个很重要的组成部分,通过服务网关可以统一向外提供REST API,例如 / 映射到后端应用 /api/user 映射到 user service, /a ...
- springCloud的feign异常:RequestHeader参数为空时,对key加了大括号{}
好久没写博客了,今天趁着周末把工作中遇到的问题梳理一下(在这个问题排查过程中,发现自己排查问题的能力还是太弱了,需要加强). 最近在公司springCloud的项目里,通过feign远程调用其他服务, ...