zoj2451-Minimizing maximizer(线段树,超时)

来源:互联网 发布:coc野蛮人升级数据 编辑:程序博客网 时间:2024/06/08 00:45

虽然说用了线段树, 但是还是超时...感觉是用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;}


 

原创粉丝点击