看到这道题毫无疑问就是线段树做,在2个小时的时间卡死在这道题了。。。一直觉得会超内存,后来看了题解才知道自己真是笨的可以。。。题目做的太少的缘故吧。。。这道题正好是点更新,果断放弃了线段树,用树状数组来搞(结果到最后也没有更新,反正趁机又复习了一下树状数组),第一次用map,感觉真是好用啊。。。下面是ac代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
using namespace std;
const int maxn = 100005;
int a[maxn<<1],c[maxn<<1],n;
map <long long,int> u;
int lowbit(int x)
{
return x&(-x);
}
void init()
{
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
{
for(int j=i-lowbit(i)+1;j<=i;j++)
{
c[i]+=a[j];
}
}
}
int Sum(int i)
{
int sum=0;
while(i)
{
sum+=c[i];
i-=lowbit(i);
}
return sum;
}
void change(int i,int x)
{
while(i<=n)
{
c[i]+=x;
i+=lowbit(i);
}
}
int main()
{
int tCase;
scanf("%d",&tCase);
while(tCase--)
{
int N;
scanf("%d",&N);
n=0;
u.clear();
while(N--)
{
long long x,y;
scanf("%I64d%I64d",&x,&y);
u[x]=u[x]+1;
u[y+1]=u[y+1]-1;
}
map <long long,int> :: iterator iter;
for(iter=u.begin();iter!=u.end();iter++)
{
a[++n]=iter->second;
}
init();
int ans=0;
for(int i=0;i<n;i++)
{
int sum=Sum(i);
if(ans<sum)
ans=sum;
}
printf("%d\n",ans);
}
return 0;
}