NYOJ-522 Interval【树状数组】

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=522

题目大意:

给你M个区间,区间内所有整数个数+1,然后给出N个询问,问k这个数字在所有区间中一共出现了几次

解题思路:

当时第一思路就是裸的插线问点嘛,但是当时想着可能是水题,干脆水过去算了。但是悲剧了。。

于是用树状数组搞,结果悲剧的把WA看成TLE,以为看错题目了?又YY了中方法来写,总是TLE。最后无意间发现树状数组是WA啊。。。激动了一下瞬间知道是0的位置错了,然后特殊处理了一下就过了。

后来想起来,可以多加1,就不用特殊处理0了。。。。悲剧。


代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N = 100000;
const int M = N * 2 + 10;
int dp[M];

int Scan()
{
	int res = 0 , ch;
	while( !( ( ch = getchar() ) >= '0' && ch <= '9' ) )
	{
		if( ch == EOF )  return 1 << 30 ;
	}
	res = ch - '0' ;
	while( ( ch = getchar() ) >= '0' && ch <= '9' )
		res = res * 10 + ( ch - '0' ) ;
	return res ;
}

int lowbit(int n)
{
	return n & (-n);
}

void add(int i, int plus)
{
	while(i > 0)
	{
		dp[i] += plus;
		i -= lowbit(i);
	}
}

int sum(int n)
{
	int sum = 0;
	while(n <= M)
	{
		sum +=dp[n];
		n += lowbit(n);
	}
	return sum;
}    

int main()
{
	int ncase;
	int num, query;
	int from, to, now;
	scanf("%d", &ncase);
	while(ncase--)
	{
		int i, j;
		memset(dp, 0, sizeof(dp));
		num = Scan(); query = Scan();
		for(i = 0; i < num; ++i)
		{
			scanf("%d%d", &from, &to);
			if(from == -100000)
			{
				dp[0]++;
				if(to == from)
					continue;
				else
					from++;
			}
			add(from - 1 + N, -1);
			add(to + N, 1);
		}
		for(i = 0; i < query; ++i)
		{
			scanf("%d", &now);
			if(now == -100000)
				printf("%d\n", dp[0]);
			else
				printf("%d\n", sum(now + N));
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值