【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;
  }
}
相关文章
|
5月前
|
机器学习/深度学习 人工智能
PTA之N个数求和(细节题)天梯赛
编程题,要求计算以分子/分母形式给出的一组有理数的和,输出结果也要是最简有理数形式。输入包含正整数N(N≤100)及N个有理数,输出为和的最简形式。示例:输入5个数2/5, 4/15, 1/30, -2/60, 8/3,输出3 1/3;输入2个数4/3, 2/3,输出2。代码中包含求最大公约数的函数和计算有理数和的主要逻辑。
40 0
|
6月前
|
算法
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
52 1
|
6月前
好题记录:
好题记录:
38 1
|
算法
【算法挨揍日记】day12——153. 寻找旋转排序数组中的最小值、LCR 173. 点名
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:
112 1
|
12月前
|
算法 Java
代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球
代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球
64 0
|
算法 Python
算法创作|PTA-求满足条件的斐波那契数
算法创作|PTA-求满足条件的斐波那契数
177 0
|
人工智能 算法 BI
LeetCode 周赛 341 场,模拟 / 树上差分 / Tarjan 离线 LCA / DFS
上周末有单双周赛,双周赛我们讲过了,单周赛那天早上有事没参加,后面做了虚拟竞赛,然后整个人就不好了。前 3 题非常简单,但第 4 题有点东西啊,差点就放弃了。最后,被折磨了一个下午和一个大夜总算把第 4 题做出来了,除了新学的 Tarjon 离线算法,这道题还涉及到树上差分、前缀和、DFS、图论等基础知识,几度被折磨得想要放弃。这种感觉,似乎和当年在 LeetCode 上做前 10 题的时候差不多哈哈。
83 0
|
算法 编译器 C++
<<算法很美>>——(七)——DFS典题(二):数独游戏
<<算法很美>>——(七)——DFS典题(二):数独游戏
<<算法很美>>——(七)——DFS典题(二):数独游戏
UPC-游戏智商+ 路标 (动态规划+DFS)
UPC-游戏智商+ 路标 (动态规划+DFS)
115 0
|
Java Shell
Codeforces Round #746 (Div. 2) D - Hemose in ICPC ?(交互 二分 欧拉序)
Codeforces Round #746 (Div. 2) D - Hemose in ICPC ?(交互 二分 欧拉序)
153 0