看到这道题毫无疑问就是线段树做,在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 ",ans); } return 0; }