【AtCoder】离线询问+树状数组

简介: 笔记

题目描述



input#1:


2 3 1

1 1

1 2

2 2

1 2


output#1:


3


input#2:


10 3 2

1 5

2 8

7 10

1 7

3 10


output#2:


1

1


input#3:


10 10 10

1 6

2 9

4 5

4 7

4 7

5 8

6 6

6 7

7 9

10 10

1 8

1 9

1 10

2 8

2 9

2 10

3 8

3 9

3 10

1 10


output#3:


7

9

10

6

8

9

6

7

8

10


题意



17.png

思路


如本文标题,我们需要对询问离线处理,这样对于区间询问,我们就可以进行排序,并使得左端点单调增,以便处理后续问题。


考虑用树状数组维护区间右端点,所以可以先将所有的区间的右端点加入树状数组中。在每次询问一个区间 [ l , r ] [l, r][l,r] 时,删掉所有区间左端点小于 l ll 的树状数组中右端点的值。然后直接进行查询当前右端点小于等于 r rr 的值的个数,即位该询问的结果。


代码


class BIT {
public:
  BIT() { memset(tr, 0, sizeof tr); }
  int tr[N];
  void add(int x, int v = 1) { for (; x < N; x += x & -x) tr[x] += v; }
  int sum(int x) { int res = 0; for (; x; x -= x & -x) res += tr[x]; return res; }
};
int n, m, q;
struct node {
  int l, r;
  int id;
  bool operator<(const node &A) const {
    if (l == A.l) return r < A.r;
    return l < A.l;
  }
}; 
node a[N], b[N];
int res[N];
void solve() {
  cin >> n >> m >> q;
  BIT tree;
  for (int i = 1; i <= m; i++) {
    int l, r; cin >> l >> r;
    a[i] = {l, r};
    tree.add(r, 1);
  }
  for (int i = 1; i <= q; i++) {
    int l, r; cin >> l >> r;
    b[i] = {l, r, i}; 
  }
  sort(a + 1, a + 1 + m);
  sort(b + 1, b + 1 + q);
  int j = 1;
  for (int i = 1; i <= q; i++) {
    int l = b[i].l, r = b[i].r, id = b[i].id;
    while (j <= m && a[j].l < l) {
      tree.add(a[j].r, -1);
      j++;
    }
    res[id] = tree.sum(r);
  }
  for (int i = 1; i <= q; i++) {
    cout << res[i] << endl;
  }
}
相关文章
|
7月前
|
算法 vr&ar 图形学
☆打卡算法☆LeetCode 222. 完全二叉树的节点个数 算法解析
☆打卡算法☆LeetCode 222. 完全二叉树的节点个数 算法解析
|
算法
代码随想录 Day26 贪心 01 全集 LeetCode455 分发饼干 LeetCodeT346摆动序列 LeetCdoe T53 最大子数组和
代码随想录 Day26 贪心 01 全集 LeetCode455 分发饼干 LeetCodeT346摆动序列 LeetCdoe T53 最大子数组和
46 0
|
7月前
|
Java C++ Python
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-456 求链表各节点的平均值(C++解法)
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-456 求链表各节点的平均值(C++解法)
55 0
|
7月前
|
计算机视觉
【每日一题Day231】LC1240铺瓷砖 | 暴力回溯
【每日一题Day231】LC1240铺瓷砖 | 暴力回溯
60 0
|
人工智能 算法 BI
C++深度优先(DFS)算法的应用:收集所有金币可获得的最大积分
C++深度优先(DFS)算法的应用:收集所有金币可获得的最大积分
|
人工智能 算法 BI
LeetCode 周赛 341 场,模拟 / 树上差分 / Tarjan 离线 LCA / DFS
上周末有单双周赛,双周赛我们讲过了,单周赛那天早上有事没参加,后面做了虚拟竞赛,然后整个人就不好了。前 3 题非常简单,但第 4 题有点东西啊,差点就放弃了。最后,被折磨了一个下午和一个大夜总算把第 4 题做出来了,除了新学的 Tarjon 离线算法,这道题还涉及到树上差分、前缀和、DFS、图论等基础知识,几度被折磨得想要放弃。这种感觉,似乎和当年在 LeetCode 上做前 10 题的时候差不多哈哈。
87 0
|
数据安全/隐私保护
【广度优先搜索】N叉树的层序遍历 | 腐烂的橘子 | 单词接龙 | 最小基因变化 | 打开转盘锁
【广度优先搜索】N叉树的层序遍历 | 腐烂的橘子 | 单词接龙 | 最小基因变化 | 打开转盘锁
【广度优先搜索】N叉树的层序遍历 | 腐烂的橘子 | 单词接龙 | 最小基因变化 | 打开转盘锁
|
定位技术
【CCCC】L3-005 垃圾箱分布 (30分),Dijkstra跑n遍 = 多源最短路
【CCCC】L3-005 垃圾箱分布 (30分),Dijkstra跑n遍 = 多源最短路
144 0
|
算法 前端开发 JavaScript
「LeetCode」129-求根节点到叶节点数字之和⚡️
「LeetCode」129-求根节点到叶节点数字之和⚡️
127 0
「LeetCode」129-求根节点到叶节点数字之和⚡️
|
算法 前端开发 程序员
「LeetCode」剑指Offer-41数据流中的中位数⚡️
「LeetCode」剑指Offer-41数据流中的中位数⚡️
107 0
「LeetCode」剑指Offer-41数据流中的中位数⚡️