P2184 贪婪大陆 (线段树+差分思维)

题目链接

在这里插入图片描述

题意:简单点说就是,操作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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值