题意:求给定区间内不同数的和

经典例题https://vjudge.net/problem/HDU-3333


解题思路:

这两天有点傻,emmm

离线操作

扫一遍数组

对于重复的值树状数组维护最靠近当前坐标的那一个,等同于把之前重复的元素删掉。

这样再对询问进行前缀和计算则只能计算到最靠近当前点的每个只出现一次的元素

不在区间的自然查询不到,树状数组快速求前缀和记录答案输出即可


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e6 + 100;struct node
{ll fst, lst, id;
}arr[MAXN];ll num[MAXN] = {0}, ans[MAXN] = {0};bool cmp(node a, node b) { return a.lst == b.lst ? a.fst <= b.fst : a.lst <= b.lst; } struct bit
{ll c[MAXN], N;bit() {}bit(int n) { N = n; fill(c, c + N + 1, 0);    }int lowbit(int x) { return x & -x; }void update(int pos, ll val){for( ;pos <= N; pos += lowbit(pos))c[pos] += val;}ll ask(int pos){ll ret = 0;for( ;pos; pos -= lowbit(pos))ret += c[pos];return ret;}
};int lst[MAXN] = {0};int main()
{ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);ll n, m;cin >> n >> m;bit BT(n);for(int i = 1; i <= n; ++i)cin >> num[i];for(int i = 0; i < m; ++i){cin >> arr[i].fst >> arr[i].lst;arr[i].id = i;}sort(arr, arr + m, cmp);int rp = 0;for(int i = 1; i <= n && rp < m; ++i){if(lst[num[i]])BT.update(lst[num[i]], -num[i]);BT.update(i, num[i]);lst[num[i]] = i;while(i == arr[rp].lst){ans[arr[rp].id] = BT.ask(i) - BT.ask(arr[rp].fst - 1);++rp;}}for(int i = 0; i < m; ++i)cout << ans[i] << '\n';return 0;
}

[树状数组] Galahad相关推荐

  1. 牛客练习赛52.Galahad(树状数组维护区间不相同数的和)

    链接:https://ac.nowcoder.com/acm/contest/1084/B 来源:牛客网 Galahad 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K ...

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

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

  3. 牛客练习赛52 B:Galahad(树状数组维护区间不同元素和(个数))

    [题目] 查询区间和,如果区间元素重复出现则计数一次. [题解] 按区间的右端点建立树状数组,维护区间[1,R]的每个元素的最右位置.按查询区间的右端点排序,依次处理,每次更新当前值的最右位置即可. ...

  4. 洛谷 P5057 [CQOI2006]简单题(树状数组)

    嗯... 题目链接:https://www.luogu.org/problem/P5057 首先发现这道题中只有0和1,所以肯定与二进制有关.然后发现这道题需要支持区间更改和单点查询操作,所以首先想到 ...

  5. Color the ball(HDU1556)树状数组

    每次对区间内气球进行一次染色,求n次操作后后所有气球染色次数. 树状数组,上下区间更新都可以,差别不大. 1.对于[x,y]区间,对第x-1位减1,第y位加1,之后向上统计 #include<b ...

  6. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

  7. Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)

    题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...

  8. poj_3067 树状数组

    题目大意 左右两个竖排,左边竖排有N个点,从上到下依次标记为1,2,...N; 右边竖排有M个点,从上到下依次标记为1,2....M.现在从K条直线分别连接左边一个点和右边一个点,求这K条直线的交点个 ...

  9. hdu 1166 敌兵布阵(树状数组)

    题意:区间和 思路:树状数组 #include<iostream> #include<stdio.h> #include<string.h> using names ...

最新文章

  1. springmvc是如何和前端页面联系起来的
  2. 设计模式 2014-12-19
  3. 有道云笔记 网络连接失败
  4. Python入门100题 | 第051题
  5. MySQL 学习二:高手必备!MySQL 增删改查高级命令大全硬核总结!
  6. 开源jumpserver 堡垒机搭建
  7. 漫步数学分析八——集合边界
  8. 【英语学习】【Daily English】U15 Culture L03 How will that help me to fit in
  9. Web Hacking 101 中文版 十六、模板注入
  10. ubuntu20.04 cudnn7.5.6_每日一题|小学数学1——6年级天天练习
  11. bzoj 3101: N皇后
  12. centos 网卡状态
  13. 新型肺炎数据,可以用Excel绘制成3维地图
  14. Linux查看可执行文件依赖库
  15. 蓝牙 - 注册SIG账号
  16. 论软件测试工程师面试套路和暗语灵魂解密(建议收藏)
  17. 寻路机器人单片机程序示例_单片机c语言示例程序
  18. 用Android 写生成的梅花
  19. xps15 9500加装1T硬盘
  20. mac中没有my.cnf文件 mysql

热门文章

  1. swt包下载,swt包引入(一个简单的SWT程序实例及详解)
  2. linux fscanf,linux fscanf
  3. Java虚拟机讲解 与 搞垮Java虚拟机
  4. 201871010123-吴丽丽《面向对象程序设计(Java)》第四周学习总结
  5. 解决mac idea2020打开闪退问题
  6. MySQL操作数据库语法及常见MySQL面试题与答案
  7. I2C协议研读(三):仲裁和时钟同步
  8. C程序设计语言第二版·新版,C程序设计语言(第2版·新版) PDF扫描版[19MB]
  9. 渗透测试 ( 4 ) --- Meterpreter 命令详解
  10. 全国电费优惠充值接口源码