题目大意:给你n个人,每个人都有一个id,有m个询问,每次询问一个区间[l,r],问该区间内部有多少的id是连续的(单独的也算是一个)

思路:做了那么多离线+树状数组的题目,感觉这种东西就是一个模板了,23333,反正都是定义右区间的。

这题的关键难度就是如何定义id是连续的呢。我们每次往区间里面放一个数值以后都要add(pos, 1),就是把pos~n的所有的关系都+1.然后如果说在pos之前就出现id-1,就要add(pos[id-1], -1)(同理id+1也是这样),这样子表示从pos[id-1]~n开始,后面的全都和他是存在组队的关系的,接下来就简单了。

  1. //看看会不会爆int!数组会不会少了一维!
  2. //取物问题一定要小心先手胜利的条件
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5. #define LL long long
  6. #define ALL(a) a.begin(), a.end()
  7. #define pb push_back
  8. #define mk make_pair
  9. #define fi first
  10. #define se second
  11. const int maxn = 1e5 + ;
  12. vector<pair<int, int> > q[maxn];
  13. int pos[maxn], a[maxn], tree[maxn], ans[maxn];
  14. int n, m;
  15. inline int lowbit(int x){return x & -x;}
  16.  
  17. void update(int x, int val){
  18. for (int i = x; i <= n; i += lowbit(i)){
  19. tree[i] += val;
  20. }
  21. }
  22.  
  23. int sum(int x){
  24. int ans = ;
  25. for (int i = x; i > ; i -= lowbit(i)){
  26. ans += tree[i];
  27. }
  28. return ans;
  29. }
  30.  
  31. int main(){
  32. int t; cin >> t;
  33. while (t--){
  34. scanf("%d%d", &n, &m);
  35. memset(pos, , sizeof(pos));
  36. for (int i = ; i <= n; i++) {
  37. scanf("%d", a + i);
  38. pos[a[i]] = i;
  39. q[i].clear();
  40. }
  41. for (int i = ; i <= m; i++){
  42. int l, r; scanf("%d%d", &l, &r);
  43. q[r].pb(mk(l, i));
  44. }
  45. memset(tree, , sizeof(tree));
  46. for (int i = ; i <= n; i++){
  47. update(i, );
  48. if (a[i] + <= n && pos[a[i] + ] < i) update(pos[a[i] + ], -);
  49. if (a[i] - >= && pos[a[i] - ] < i) update(pos[a[i] - ], -);
  50. int len = q[i].size();
  51. for (int j = ; j < len; j++){
  52. pair<int, int> p = q[i][j];
  53. ans[p.second] = sum(i) - sum(p.first - );
  54. }
  55. }
  56. for (int i = ; i <= m; i++){
  57. printf("%d\n", ans[i]);
  58. }
  59. }
  60. return ;
  61. }

区间的关系的计数 HDU 4638 离线+树状数组的更多相关文章

  1. HDU 4417 离线+树状数组

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. HDU - 4777 离线树状数组

    离线树状数组搞一搞. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #de ...

  3. 区间gcd问题 HDU 5869 离线+树状数组

    题目大意:长度n的序列, m个询问区间[L, R], 问区间内的所有子段的不同GCD值有多少种. 子段就是表示是要连续的a[] 思路:固定右端点,预处理出所有的gcd,每次都和i-1的gcd比较,然后 ...

  4. HDU 4638 Group 树状数组 + 思路

    实际上就是问这个区间编号连续的段的个数,假如一个编号连续的段有(a+b)个人,我把他们分在同一组能得到的分值为(a+b)^2,而把他们分成人数为a和b的两组的话,得到的分值就是a^2+b^2,显然(a ...

  5. HDU 4638 Group ★(树状数组)

    题意 询问一段区间里的数能组成多少段连续的数. 思路 先考虑从左往右一个数一个数添加,考虑当前添加了i - 1个数的答案是x,那么可以看出添加完i个数后的答案是根据a[i]-1和a[i]+1是否已经添 ...

  6. 利用id来进行树状数组,而不是离散化以后的val HDU 4417 离线+树状数组

    题目大意:给你一个长度为n的数组,问[L,R]之间<=val的个数 思路:就像标题说的那样就行了.树状数组不一定是离散化以后的区间,而可以是id //看看会不会爆int!数组会不会少了一维! / ...

  7. HDU 5869 (离线+树状数组)

    Problem Different GCD Subarray Query 题目大意 给定n个数的序列,有q个询问,每次询问一个区间中所有子区间所形成不同的gcd的数量. 解题分析 由于固定一个数为右端 ...

  8. HDU 5249 离线树状数组求第k大+离散化

    KPI Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. hdu 4605 Magic Ball Game (在线主席树/离线树状数组)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4605 题意: 有一颗树,根节点为1,每一个节点要么有两个子节点,要么没有,每个节点都有一个权值wi .然后,有一个球,附带值x . 球 ...

随机推荐

  1. 修改TFS与本地源代码映射路径

    使用源代码管理资源管理器修改工作区 在“文件”菜单上单击“源代码管理”,再单击“工作区”. 在“管理工作区”对话框的“名称”列下,突出显示要修改的工作区,然后单击“编辑”. 在“编辑工作区”对话框中: ...

  2. VS2013程序打包部署详细图解

      目录(?)[+]   新建项目 FILE –> New –> Project,如下图所示:  注意:如果 InstallShield Limited Edition Project 显 ...

  3. 【第三篇】学习 android 事件总线androidEventbus之发布事件,子线程中接收

    发送和接收消息的方式类似其他的发送和接收消息的事件总线一样,不同的点或者应该注意的地方: 1,比如在子线程构造方法里面进行实现总线的注册操作: 2,要想子线程中接收消息的功能执行,必须启动线程. 3, ...

  4. linux中iptables配置文件及命令详解详解

    iptables配置文件 直接改iptables配置就可以了:vim /etc/sysconfig/iptables. 1.关闭所有的 INPUT FORWARD OUTPUT 只对某些端口开放. 下 ...

  5. Oracle技术整理(转载)

  6. hdu_5800_To My Girlfriend(变种背包)

    题目链接:hdu_5800_To My Girlfriend 题意: 给你n和物品和一个重量m,让你求 题解: To My Girlfriend 令dp[i][j][s1][s2]表示前i个物品填了j ...

  7. vb脚本自动更新版本信息

    使用的串口显示软件为secureCrt,支持脚本功能,今天写了一个简单的软件升级脚本(VB脚本). 如下: # $language = "VBScript" # $interfac ...

  8. Git 删除文件

    在Git中,删除也是一种修改的操作,我们验证一下,先在工作目录中添加一个新文件test.txt,并且提交: $ git statusOn branch masterUntracked files:  ...

  9. 第3章 Java语言基础----成员变量与局部变量

    在对局部变量进行赋值时,不能对非静态字段age进行静态引用,图1错误,加上static后图二正确,图3与图4类似,如下图所示: 图1图2 图3图4 2.成员变量times在类中定义,局部变量times ...

  10. php:sprintf

    十六进制 $hex = sprintf("%x",18); 输出:12(%x表示十六进制) $hex = sprintf("%4x",18); 输出:strin ...