牛客练习赛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 ...
随机推荐
- java中讲讲DataInputStream的用法,举例?
[学习笔记] 2.4 DataInputStream的用法 马 克-to-win:DataInputStream顾名思义:就是专门用来读各种各样的数据的,比如(int,char,long等),一定要注 ...
- Thinking In Java 4th Chap4 控制执行流程
Foreach语法: 例如:float f[]=new float [10]; for(float x:f){/*****/} for(char c:"Afaslkd aslfjala al ...
- python-----模块【第一部分】-----
一.hashlib(md5) import hashlib obj = hashlib.md5('dsfd'.encode('utf-8')) obj.update('123'.encode('utf ...
- python经典小程序集锦(一) 实现九九乘法表
本篇文章主要是收集整理一些小程序以供大家娱乐,或者是在面试的时候使用到.文章会持续更新,希望大家收藏关注哦. 1.代码实现过程 for i in range(1, 10): for j in rang ...
- 10-MySQlL DBA笔记-基础知识
第四部分 运维篇 首先来了解一下数据库的定义,数据库是高效的.可靠的.易用的.安全的多用户存储引擎,我们可以通过它访问大量的持久化数据.我们管理和维护数据库,本质上也是要确保如上的特性,尽可能地保证数 ...
- Java生成随机数列表
生成随机数列表 1.Java8以前 (1)Math.random private List<UserEntity> random1() { ArrayList<UserEntity& ...
- .Net Core项目如何设置静态页面为项目的启动页面?
最近在使用Core的webApi作为服务器端的数据提供者,但是需要有自己的官网,来指导前端如何使用该接口,因为不想接入MVC这么大的框架,于是写了个静态页面挂上doc文档提供下载就行. 在项目的Sta ...
- No database provider has been configured for this DbContext
var context = ((IInfrastructure<IServiceProvider>)set).GetService<DbContext>(); 在EF Core ...
- DSN 建立达梦7(DM)连接
(DSN)Data Source Name 数据源名称 “ODBC数据源管理器”提供了三种DSN,分别为用户DSN.系统DSN和文件DSN.其中: 用户DSN会把相应的配置信息保存在Wind ...
- html-proload
对基础与初始化进行预加载 加载顺序 document > preload > 正常加载 media 属性 不同设备时的响应式加载 - media="(max-width: 600 ...