题目链接: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;
}