zoukankan      html  css  js  c++  java
  • zoj3381

     1 /*
     2 题意:n天,第i天可以获得的值为vi,如果获得第i天的值,那么下一次能获得的值
     3 只能在[i+x[i],i+y[i]-1]天中取,为最大能获得多少值;
     4 
     5 分析:直接DP,每次维护经过前i-1天第i天能可以获得的最大值,用线段树维护就要同时记录下区间的最大最小值;
     6 表示区间内的可能获得最大值的最大值和最小值;
     7 另一种DP的思路,dp[i]表示选了第i天,最终能获得的最大值,那么dp[i]=v[i]+max(dp[i+x[i]],dp[i+y[i]-1]);
     8 直接用线段树维护区间最大值就可以了;
     9 
    10 */
    11 #include<cstdio>
    12 #include<cstring>
    13 #include<cstdlib>
    14 #include<iostream>
    15 #include<cmath>
    16 #include<algorithm>
    17 #define lson l,m,rt<<1
    18 #define rson m+1,r,rt<<1|1
    19 using namespace std;
    20 const int N=50000+10;
    21 int maxv[N<<2],minv[N<<2],col[N<<2];
    22 int x[N],y[N],v[N];
    23 int n;
    24 void pushup(int rt){
    25     maxv[rt]=max(maxv[rt<<1],maxv[rt<<1|1]);
    26     minv[rt]=min(minv[rt<<1],minv[rt<<1|1]);
    27 }
    28 void build(int l,int r,int rt){
    29     maxv[rt]=minv[rt]=col[rt]=0;
    30     if (l==r) return ;
    31     int m=(l+r)>>1;
    32     build(lson);build(rson);
    33 }
    34 void pushdown(int rt){
    35     if (col[rt]){
    36         if (col[rt]>=maxv[rt<<1]){
    37             maxv[rt<<1]=minv[rt<<1]=col[rt];
    38         }else if (col[rt]>minv[rt<<1])minv[rt<<1]=col[rt];
    39         col[rt<<1]=max(col[rt<<1],col[rt]);
    40 
    41         if (col[rt]>=maxv[rt<<1|1]){
    42             maxv[rt<<1|1]=minv[rt<<1|1]=col[rt];
    43         }else if (col[rt]>minv[rt<<1|1])minv[rt<<1|1]=col[rt];
    44         col[rt<<1|1]=max(col[rt<<1|1],col[rt]);
    45 
    46         col[rt]=0;
    47     }
    48 }
    49 void update(int L,int R,int v,int l,int r,int rt){
    50     if (v<=minv[rt]) return;
    51     if (L<=l && r<=R){
    52         if (v>=maxv[rt]){
    53             maxv[rt]=minv[rt]=v;
    54         }else if (v>minv[rt]){
    55             minv[rt]=v;
    56         }
    57         col[rt]=max(col[rt],v);
    58         return;
    59     }
    60     int m=(l+r)>>1;
    61     pushdown(rt);
    62     if (L<=m) update(L,R,v,lson);
    63     if (m< R) update(L,R,v,rson);
    64     pushup(rt);
    65 }
    66 int query(int L,int l,int r,int rt){
    67     if (l==r){
    68         return maxv[rt];
    69     }
    70     int m=(l+r)>>1;
    71     pushdown(rt);
    72     if(L<=m) return query(L,lson);
    73     else return query(L,rson);
    74 }
    75 int main(){
    76     while (~scanf("%d",&n)){
    77         for (int i=1;i<=n;i++){
    78             scanf("%d%d%d",&v[i],&x[i],&y[i]);
    79         }
    80         build(1,n+1,1);
    81         int ret=0;
    82         for (int i=1;i<=n;i++){
    83             int t=query(i,1,n+1,1);
    84             if (i!=1 && t==0) continue;
    85             t+=v[i];
    86         //    cout<<i<<" "<<t<<endl;
    87             if (t>ret) ret=t;
    88             int l=min(n+1,i+x[i]),r=min(n+1,i+y[i]-1);
    89             update(l,r,t,1,n+1,1);
    90         }
    91         printf("%d\n",ret);
    92     }
    93 
    94     return 0;
    95 }
  • 相关阅读:
    [转+]C语言复杂声明
    c和c++数组初始化一点小区别
    [转]Linux ftp命令的使用方法
    Ubuntu 12.04 英文版中文输入法设置
    [转]Android手机中获取手机号码和运营商信息
    把google地圖放在Crm Entity中
    为什么报表里面记录的创建时间 比我们电脑客户端的世界时间 隔8个小时?这个是什么原因?
    print style Iframe
    取出MSCRM父窗口的欄位的值
    Display Fetch in IFRAME – Part 2
  • 原文地址:https://www.cnblogs.com/Rlemon/p/3092965.html
Copyright © 2011-2022 走看看