虽然说用了线段树, 但是还是超时...感觉是用vector的原因.希望各位指导指导!
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
struct node
{
int l,r;
node *lc,*rc;
int cover;
node():cover(0),lc(NULL),rc(NULL){}
};
node *build(int a,int b)
{
node *p=new node;
p->l=a;
p->r=b;
if(b-a==1)
return p;
p->lc=build(a,(a+b)/2);
p->rc=build((a+b)/2,b);
return p;
}
void insert(node *T,int a,int b)
{
if(T)
{
if(a<=T->l&&T->r<=b)
{
T->cover=1;
return;
}
if(a<=(T->r+T->l)/2)
insert(T->lc,a,b);
if(b>(T->r+T->l)/2)
insert(T->rc,a,b);
}
}
bool search(node *T,int a,int b)
{
if(T)
{
if(T->cover)//不需要再加入
return false;
if(a<=T->l&&T->r<=b)//需要
{
T->cover=1;
return true;
}
if(a<=(T->r+T->l)/2)
if(search(T->lc,a,b))
return true;
if(b>(T->r+T->l)/2)
if(search(T->rc,a,b))
return true;
}
return false;
}
int main()
{
int len,col;
node *p;
vector<node *> vec;
while(cin>>len>>col)
{
node *head;
head=build(1,len);
vec.clear();
int l,r;
while(col--)
{
cin>>l>>r;
p=new node;
p->l=l;
p->r=r;
vector<node *>::iterator it;
bool flag=true;
for(it=vec.begin();it!=vec.end();++it)
{
if((*it)->l<=p->l&&(*it)->r>=p->r)
{
flag=false;
break;
}
if((*it)->l>p->l&&(*it)->r<p->r)
vec.erase(it);
}
if(flag)
{
if(search(head,l,r))
{
vec.push_back(p);
insert(head,l,r);
}
}
}
cout<<vec.size()<<endl;
}
return 0;
}