SSL_1502 校门外的树

校门外的树

链接

SSL_1502 校门外的树

题目大意

现有一排格子,可以进行两种操作: k = 1 k=1 k=1时,在 [ l , r ] [l,r] [l,r]的每个格子中放置一个数 x x x k = 2 k=2 k=2时,读取 [ l , r ] [l,r] [l,r]的每个格子中不同数的种类。

Input

第一行n,m表示道路总长为n,共有m个操作
接下来m行为m个操作

Output

对于每个k=2输出一个答案

Sample Input

5 4
1 1 3
2 2 5
1 2 4
2 3 5

Sample Output

1
2

思路

  1. 这题应该是之前用DP做过的。
  2. 这里要用到两个一维数组。一个用来存种树区间的左端点,另一个用来存右端点。
  3. 对于每个询问,先统计坐标为(0,r]的左端点的个数,表示(0,r]一共种了多少种数,再统计坐标为(0,l)的右端点的个数,表示右多少种树完全重在l的左边。最后再把两个值相减即为询问的答案。

代码

 #include<algorithm>
#include<cstdio>
using namespace std;
int n,m,k,l,r,a[2][50001],c1,c2;
int lb(int i)
{
	return i&(-i);
}
void add(int i,int t)
{
	while(i<=n)
	{
		a[t][i]++;
		i+=lb(i);
	}
}
int cou(int i,int t)
{
	int ans=0;
	while(i>0)
	{
		ans+=a[t][i];
		i-=lb(i);
	}
	return ans;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&k,&l,&r);
		if(k==1)
		{
			add(l,0);//在l插入一个“左端点”
			add(r,1);//在r插入一个“右端点
		}
		if(k==2)
		{
			c1=cou(r,0);//统计r左边的“左端点”的个数
			c2=cou(l-1,1);//统计l-1左边的“右端点”的个数
			printf("%d\n",c1-c2);
		}
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值