传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2225
树状数组维护一维,bst维护另一维
好像有nlogn做法……
于是垫底倒数第一
Code:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int getint(){
int res=0,f=1;char c=getchar();
while(!isdigit(c))f=f==-1||c=='-'?-1:1,c=getchar();
while(isdigit(c))res=res*10+c-'0',c=getchar();
return res*f;
}
int n,tot;
struct pii{
int first,second;
pii(int x=0,int y=0):first(x),second(y){}
bool operator==(pii oth)const{return first==oth.first&&second==oth.second;}
bool operator<(pii oth)const{return first<oth.first||(first==oth.first&&second>oth.second);}
};
pii a[maxn];
map<int,int>M;
struct node{
int key,mx,size;
pii val;
node *c[2];
node(pii _val=pii(0,0),node *C=0){
val=_val;key=rand();mx=_val.second;
c[0]=c[1]=C;size=1;
}
void rz(){
size=c[0]->size+1+c[1]->size;
mx=max(c[0]->mx,val.second);
mx=max(c[1]->mx,mx);
}
}*Null,pool[maxn*15];
node *newnode(pii _val=pii(0,0),node *C=0){
static int tot=0;
if(tot<maxn*15){
pool[tot].val=_val;pool[tot].key=rand();pool[tot].mx=_val.second;
pool[tot].c[0]=pool[tot].c[1]=C;pool[tot].size=1;
return &pool[tot++];
}else return new node(_val,C);
}
struct Treap{
node *root;
void init(){
root=Null;
}
void rot(node *&t,bool d){
node *p=t->c[d];t->c[d]=p->c[!d];
p->c[!d]=t;t->rz();p->rz();t=p;
}
void _insert(node *&t,pii p){
if(t==Null){t=newnode(p,Null);return;}
if(t->val==p)return ;
_insert(t->c[t->val<p],p);
if(t->c[t->val<p]->key<t->key)
rot(t,t->val<p);else t->rz();
}
int _Qmax(node *t,int p){
int ans=0;
while(t!=Null){
if(t->val.first<p){
ans=max(ans,max(t->c[0]->mx,t->val.second));
t=t->c[1];
}else t=t->c[0];
}return ans;
}
void deb(node *t){
if(t!=Null)
printf("first:%d second:%d mx:%d size:%d\n",t->val.first,t->val.second,t->mx,t->size);
if(t->c[0]!=Null)printf("L: "),deb(t->c[0]);
if(t->c[1]!=Null)printf("R: "),deb(t->c[1]);
}
void deb(){deb(root);puts("");}
void insert(pii p){_insert(root,p);}
int Qmax(int p){return _Qmax(root,p);}
}T[maxn];
inline int lowbit(int x){return x&-x;}
void updata(int x,pii p){
while(x<=tot)T[x].insert(p),x+=lowbit(x);
}
int Qmax(int x,int p){
int ans=0;
for(int i=x;i;i-=lowbit(i)){
ans=max(ans,T[i].Qmax(p));
}return ans;
}
int ans;
int main(){
Null=new node(pii(0,0),0);
Null->size=0;Null->key=INT_MAX;
Null->c[0]=Null->c[1]=Null;
n=getint();
for(int i=1;i<=n;i++){
a[i].first=getint();a[i].second=getint();
M[a[i].first]=1;
}for(map<int,int>::iterator it=M.begin();it!=M.end();it++)it->second=++tot;
for(int i=1;i<=tot;i++)T[i].init();
for(int i=1;i<=n;i++)a[i].first=M[a[i].first];
for(int i=1;i<=n;i++){
int res=Qmax(a[i].first-1,a[i].second)+1;
updata(a[i].first,pii(a[i].second,res));
ans=max(ans,res);
}cout<<ans<<endl;
return 0;
}