牛客练习赛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 ...
随机推荐
- Spring 加载项目外部配置文件
背景 在项目的部署过程中,一般是打成 war 或者 jar 包,这样一般存在两种问题: 即使是配置文件修改,也还需要整个项目重新打包和部署. 整个项目只有一套环境,不能切换. 针对上面的问题,可以使用 ...
- 安装sqlserver导致80端口被占用解决方法
安装sqlserver导致80端口被占用解决方法 系统占用的端口一般都是微软官方的产品占用的.所以这个时候主要考虑到几个服务: SQL Server导致.其中很有可能是SQL Server Repor ...
- Django-djangorestframework-请求模块-获取请求参数
目录 请求模块 源码分析 正式使用 总结 请求模块 主要是分析 drf 二次封装后的 request 对象 以及怎么拿到请求传递过来的数据(url 拼接的数据,数据包传过来的数据) 源码分析 源码查看 ...
- Django模型(model)系统
Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...
- js 替换html
function getInfo(){ var player_name=$("#name").val(); $.ajax({ url: 'get_wefare', method: ...
- IoC(Inversion of Control 控制反转)
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency Inject ...
- 怎样获取响应头: Response Header
1. 使用 xhr.getResponseHeader()可以获取指定响应头字段值. function getHeaderTime() { console.log(this.getResponseHe ...
- vue项目中导出PDF的两种方式
参考大家导出的方式,基本上是如下两种: 1.使用 html2Canvas + jsPDF 导出PDF, 这种方式什么都好,就是下载的pdf太模糊了.对要求好的pdf这种方式真是不行啊! 2.调用浏览器 ...
- 【原创】大叔经验分享(81)marathon上app无法重启
通过api调用marathon重启app后出现deployment,但是app不会重启,配置如下: "constraints": [ [ "hostname", ...
- C++ STL 之 list
#include <list> #include <iostream> using namespace std; // 打印list元素 void PrintList(list ...