[洛谷]P4939 Agent2 (#树状数组)

题目背景

炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的。每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了。只有不咕鸟Lyn_king一个人冒着太阳等了半个多小时,然后居然看到连ENLIGHTENED行动参谋咕咕咕了,果然咕咕咕是人类的本性啊。

题目描述

作为一个ENLIGHTENED行动指挥,自然不想看到这一点,于是他偷取到了那些经常咕咕咕Agent的在下来NN天的活动安排表,并且叫上了你来整理。在整理过程中,ENLIGHTENED行动指挥对你说了MM条命令,命令操作如下。

  1. 输入0,a,b0,a,b,这代表在第aa天到第bb天,有一名Agent要咕咕咕。
  2. 输入11 aa,这代表ENLIGHTENED行动指挥询问你根据目前的信息,在第aa天有多少名Agent会咕咕咕。

作为同是不咕鸟的你,也想要惩戒那些经常咕咕咕的人,所以,请协助完成ENLIGHTENED行动指挥完成整理,并且在他每次询问时,输出正确的答案。

输入格式

第一行输入两个整数输N,MN,M, 下来MM行,每行输入一个命令,命令格式见题目描述。

输出格式

对于每一次询问的操作,都要输出询问的答案。答案之间用换行隔开。

输入输出样例

输入 #1复制

5 5
0 1 2
0 1 5
1 1
0 3 5
1 5

输出 #1复制

2
2

说明/提示

对于20\%20%的数据 N,M \leq 10N,M≤10

对于40\%40%的数据 N,M \leq 10^3N,M≤103

对于60\%60%的数据 N,M \leq 10^5N,M≤105

对于100\%100%的数据 1 \leq a,b \leq N \leq 10^7,M \leq 4*10^51≤a,b≤N≤107,M≤4∗105


思路

题目描述总结起来就是要实现区间修改&单点查询

那不就是树状数组模版2吗。

当然也可以线段树做。

#include <stdio.h>
#include <iostream>
using namespace std;
int bit[10000001],a[10000001],n,m,s;
inline int lowbit(int x)
{
	return x&-x;
}
inline void update(int x,int k)
{
	while(x<=n)
	{
		bit[x]+=k;
		x+=lowbit(x);
	}
}
inline int sum(int k)
{
	register int i(0);
	while(k>0)
	{
		i+=bit[k];
		k-=lowbit(k);
	}
	return i;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	register int i,j;
	cin>>n>>m;
	for(i=1;i<=m;i++)
	{
		int Case,x,y,z;
		cin>>Case;
		if(Case==0)
		{
			cin>>x>>y;
			update(x,1);//差分思想 
			update(y+1,-1);
		}
		if(Case==1)
		{
			cin>>x;
			cout<<sum(x)<<endl;
		}
	}
	return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值