tjut 3607

#include <stdio.h>  
#include <string.h>  
#include <stdlib.h>  
#include <iostream>  
#include <algorithm>  
using namespace std;  
typedef long long ll;  
typedef unsigned long long ull;  
const int inf=0x3f3f3f3f;  
const ll INF=0x3f3f3f3f3f3f3f3fll;  
const int maxn=100010;  
int max1[maxn<<2];  
void update(int pos,int val,int le,int ri,int node){  
    if(le==ri){  
        max1[node]=val;  
        return ;  
    }  
    int t=(le+ri)>>1;  
    if(pos<=t) update(pos,val,le,t,node<<1);  
    else update(pos,val,t+1,ri,node<<1|1);  
    max1[node]=max(max1[node<<1],max1[node<<1|1]);  
}  
int query(int l,int r,int le,int ri,int node){  
    if(l<=le&&ri<=r) return max1[node];  
    int t=(le+ri)>>1,ans=-inf;  
    if(l<=t) ans=max(ans,query(l,r,le,t,node<<1));  
    if(r>t) ans=max(ans,query(l,r,t+1,ri,node<<1|1));  
    return ans;  
}  
int num[maxn],tmp[maxn],val[maxn];  
int main(){  
    int n;  
    while(scanf("%d",&n)!=-1){  
        for(int i=1;i<=n;i++){  
            scanf("%d%d",&num[i],&val[i]);  
            tmp[i-1]=num[i];  
        }  
        int k=1;  
        sort(tmp,tmp+n);  
        for(int i=1;i<n;i++){  
            if(tmp[i]!=tmp[i-1]) tmp[k++]=tmp[i];  
        }  
        memset(max1,0,sizeof(max1));  
        int ans=-inf;  
        for(int i=1;i<=n;i++){  
            int ttt=lower_bound(tmp,tmp+k,num[i])-tmp+1;  
            int ans1;  
            if(ttt==1) ans1=0;  
            else ans1=query(1,ttt-1,1,k,1);  
            ans=max(ans,ans1+val[i]);  
            update(ttt,ans1+val[i],1,k,1);  
        }  
        printf("%d\n",ans);  
    }  
    return 0;  
}  



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章