【题目】

查询区间和,如果区间元素重复出现则计数一次。

链接: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的更多相关文章

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

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

  2. 牛客第二场-J-farm-二维树状数组

    二维树状数组真的还挺神奇的,更新也很神奇,比如我要更新一个区域内的和,我们的更新操作是这样的 add(x1,y1,z); add(x2+1,y2+1,z); add(x1,y2+1,-z); add( ...

  3. 牛客练习赛47 E DongDong数颜色 (树状数组维护区间元素种类数)

    链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...

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

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

  5. LOJ107. 维护全序集【树状数组维护全序集】

    题目描述 这是一道模板题,其数据比「普通平衡树」更强. 如未特别说明,以下所有数据均为整数. 维护一个多重集 S ,初始为空,有以下几种操作: 把 x 加入 S 删除 S 中的一个 x,保证删除的 x ...

  6. 【BZOJ2124】等差子序列 树状数组维护hash值

    [BZOJ2124]等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N ...

  7. 树状数组优化DP 【模拟赛】删区间

    哇,难受得一匹. 看到题的一瞬间竟然只想到了\(n^3\)的区间\(DP\) 一.\(40pts\) 设\(f[i][j]\)代表删去\(i\)到\(j\)这一段区间的最小代价和. 然后直接写普通的区 ...

  8. bzoj 2819 Nim dfn序+树状数组维护区间异或值

    题目大意 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略 ...

  9. [poj3378] Crazy Thairs (DP + 树状数组维护 + 高精度)

    树状数组维护DP + 高精度 Description These days, Sempr is crazed on one problem named Crazy Thair. Given N (1 ...

随机推荐

  1. Spring 加载项目外部配置文件

    背景 在项目的部署过程中,一般是打成 war 或者 jar 包,这样一般存在两种问题: 即使是配置文件修改,也还需要整个项目重新打包和部署. 整个项目只有一套环境,不能切换. 针对上面的问题,可以使用 ...

  2. 安装sqlserver导致80端口被占用解决方法

    安装sqlserver导致80端口被占用解决方法 系统占用的端口一般都是微软官方的产品占用的.所以这个时候主要考虑到几个服务: SQL Server导致.其中很有可能是SQL Server Repor ...

  3. Django-djangorestframework-请求模块-获取请求参数

    目录 请求模块 源码分析 正式使用 总结 请求模块 主要是分析 drf 二次封装后的 request 对象 以及怎么拿到请求传递过来的数据(url 拼接的数据,数据包传过来的数据) 源码分析 源码查看 ...

  4. Django模型(model)系统

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

  5. js 替换html

    function getInfo(){ var player_name=$("#name").val(); $.ajax({ url: 'get_wefare', method: ...

  6. IoC(Inversion of Control 控制反转)

    控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency Inject ...

  7. 怎样获取响应头: Response Header

    1. 使用 xhr.getResponseHeader()可以获取指定响应头字段值. function getHeaderTime() { console.log(this.getResponseHe ...

  8. vue项目中导出PDF的两种方式

    参考大家导出的方式,基本上是如下两种: 1.使用 html2Canvas + jsPDF 导出PDF, 这种方式什么都好,就是下载的pdf太模糊了.对要求好的pdf这种方式真是不行啊! 2.调用浏览器 ...

  9. 【原创】大叔经验分享(81)marathon上app无法重启

    通过api调用marathon重启app后出现deployment,但是app不会重启,配置如下: "constraints": [ [ "hostname", ...

  10. C++ STL 之 list

    #include <list> #include <iostream> using namespace std; // 打印list元素 void PrintList(list ...