题意:简单点说就是,操作1相当于放置一个区间,操作2相当于询问[l,r]内涉及多少种放置的区间。
思路:对于询问的区间[l,r] 如果我们能知道 [1,r] 里面一共涉及多少个区间,[1,l-1]一共有多少个完整的区间(即区间在l左边就结束了) 。用前者减去后者就是答案了。
所以我们需要维护2个信息,对于任意下标i
①维护[1,i]的区间左端点个数(也正是涉及的区间数)
②维护[1,i-1]的区间右端点个数 (也正是i之前已经结束的区间个数)
对于每次操作1,输入L,R ,
我们要让[L,n]的每个位置左端点个数+1 让[R,n]每个位置右端点个数加1
这里就要用差分数组了,
先了解什么是差分数组:
这里就可以用线段树维护差分数组的区间和,每次修改都是单点修改。
查询a[index] 的时候直接查线段树的区间和[1,index]即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5+7;
const ll inf = 34359738370;
int sum[2][maxn<<2];//对差分数组建线段树 维护区间和 查询的时候查[1,index] 得到a[index]的变化量
int n,m;
inline int lc(int rt)
{
return rt<<1;
}
inline int rc(int rt)
{
return rt<<1 | 1