【Luogu_P2184】 贪婪大陆【树状数组】
P2184 贪婪大陆
题目背景
面对蚂蚁们的疯狂进攻,小 FF 的 Tower defence 宣告失败……人类被蚂蚁们逼到了 Greed Island 上的一个海湾。现在,小 FF 的后方是一望无际的大海,前方是变异了的超级蚂蚁。小 FF 还有大好前程,他可不想命丧于此, 于是他派遣手下最后一批改造 SCV 布置地雷以阻挡蚂蚁们的进攻。
题目描述
小 FF 最后一道防线是一条长度为 nnn 的战壕,小 FF 拥有无数多种地雷,而 SCV 每次可以在 [L,R][L, R][L,R] 区间埋放同一种不同于之前已经埋放的地雷。由于情况已经十万火急,小 FF 在某些时候可能会询问你在 [L′,R′][L',R'][L′,R′] 区间内有多少种不同的地雷,他希望你能尽快的给予答复。
输入格式
第一行为两个整数 nnn 和 mmm,nnn 表示防线长度,mmm 表示 SCV 布雷次数及小 FF 询问的次数总和。
接下来有 mmm 行,每行三个整数 q,l,rq,l,rq,l,r:
- 若 q=1q=1q=1,则表示 SCV 在 [l,r][l, r][l,r] 这段区间布上一种地雷;
- 若 q=2q=2q=2,则表示小 FF 询问当前 [l,r][l, r][l,r] 区间总共有多少种地雷。
输出格式
对于小 FF 的每次询问,输出一个答案(单独一行),表示当前区间地雷种数。
输入输出样例 #1
输入 #1
5 4
1 1 3
2 2 5
1 2 4
2 3 5
输出 #1
1
2
说明/提示
数据规模与约定
- 对于 30%30\%30% 的数据,0≤n0 \le n0≤n,m≤1000m \le 1000m≤1000。
- 对于 100%100\%100% 的数据,0≤n0 \le n0≤n,m≤105m \le 10^5m≤105。
思路:
其实答案就是R左边的区间开头-L左边的区间结尾。
code
#include<iostream>
#include<cstdio>using namespace std;const int MAXN = 1e5 + 5;int n, m;
int tr1[MAXN], tr2[MAXN];int lowbit(int x) { return x & - x; }void add_1(int x, int w) {for(int i = x; i <= n; i += lowbit(i)) tr1[i] ++;
}void add_2(int x, int w) {for(int i = x; i <= n; i += lowbit(i)) tr2[i] ++;
}int ans1(int x) {int ans = 0;for(int i = x; i; i -= lowbit(i)) ans += tr1[i];return ans;
}int ans2(int x) {int ans = 0;for(int i = x; i; i -= lowbit(i)) ans += tr2[i];return ans;
}int main() {scanf("%d%d", &n, &m);while(m --) {int op;scanf("%d", &op);if(op == 1) {int x, y;scanf("%d%d", &x, &y);add_1(x, 1);add_2(y, 1);}else {int x, y;scanf("%d%d", &x, &y);printf("%d\n", ans1(y) - ans2(x - 1));}}return 0;
}