luogu 2184 贪婪大陆

题目链接:https://www.luogu.com.cn/problem/P2184

题目大意,区间上进行两种操作。
操作一:在l-r之间埋上一种地雷。
操作二:询问在l-r之间有多少种地雷。

题解:
线段树或者树状数组都可以。
对于询问l-r之间有多少地雷,可以理解为首部在r之前的线段段数减去尾部在(r-1)之前的线段段数,所以对于埋地雷的操作l-r,可以理解为在两个线段树上的某个位置加一,询问相当于是求每个线段树的前若干个位置的总和是多少,然后两个线段树求出来的答案再进行相减操作就是答案,对于这种单点修改、区间询问的类型,用树状数组会非常方便。

注:当然树状数组也可以处理区间修改,单点询问的题目,转化成差分即可。

#include<bits/stdc++.h>
int n,op,x,y,m;
int a[110000],b[110000];
int lowbit(int p){return p&(-p);}
void add1(int p){
	while(p<=n){
		a[p]++;
		p+=lowbit(p);
	}
}
void add2(int p){
	while(p<=n){
		b[p]++;
		p+=lowbit(p);
	}
}
int query1(int p){
	int sum=0;
	while(p){
		sum+=a[p];
		p-=lowbit(p);
	}
	return sum;
}
int query2(int p){
	int sum=0;
	while(p){
		sum+=b[p];
		p-=lowbit(p);
	}
	return sum;
}
int main(){
	scanf("%d%d",&n,&m);n++;
	while(m--){
		scanf("%d%d%d",&op,&x,&y);
		x++;y++;
		if(op==1)add1(x),add2(y);
		if(op==2)printf("%d\n",query1(y)-query2(x-1));
	}
	return 0;
}
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值