【题目】

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

链接: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. Eureka【支持Remote Region】

    工程公共pom依赖 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncod ...

  2. 剑指offer12:求解double类型的浮点数base和int类型的整数exponent的次方。 保证base和exponent不同时为0

    1. 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方.保证base和exponent不同时为0. 2. 思路和方法 分析: 由于 ...

  3. 装饰器中functools的用处

    定义一个最简单的装饰器 def user_login_data(f): def wrapper(*args, **kwargs): return f(*args, **kwargs) return w ...

  4. 【转载】Jmeter接口测试+压力测试

     jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单.因为jmeter是java开发的,所以运行的时候必须先要 ...

  5. 优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam)

    优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam) 2019年05月29日 01:07:50 糖葫芦君 阅读数 455更多 ...

  6. Inno Setup CreateProcess 失败:代码 740(Inno Setup打包的程序提升为管理员权限)

    原文参考 https://www.cnblogs.com/SnailProgramer/p/4243666.html http://blog.csdn.net/x356982611/article/d ...

  7. 设计模式风格<一>;回调风格

    主程序,是一个人,有一个类是同事: static void Main(string[] args) { Console.WriteLine("Hello Go to Lunch?" ...

  8. async/await 的引用

    static async void Start() { string s = "ass"; Console.WriteLine(getMemory(s)+"Hello W ...

  9. xss part2

    0x01 xss challenge level 6-10 1.1 level 6 test with typical, notice the script has changed change sc ...

  10. 后台程序员简单应用前端的bootstrap(小白)

    原因: 现在技术更新很快,我们需要掌握更多的语言和技术,公司现在也希望招全栈工程师. 名词: bootstrap(前端框架),less(css的扩充) 案例: 在bootstrap中常用row行级元素 ...