tjut 3607

来源:互联网 发布:网络养鹅游戏靠谱吗 编辑:程序博客网 时间:2024/05/16 08:26
#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;  }  

0 0
原创粉丝点击