hdu 4833

 

离散化

 

const  int  maxn = 40000 ;

struct ShouRu{
       int  day ;
       int  money ;
       void  read(){
             scanf("%d%d" , &day , &money) ;
       }
}shouru[maxn] ;

struct TouZi{
       int  st ;
       int  ed ;
       int  value ;
       void  read(){
             scanf("%d%d%d" , &st , &ed , &value) ;
       }
}touzi[maxn] ;

int   a[maxn]   ;
vector< pair<int , int> > lis[maxn] ;
LL   money[maxn] ;
LL   dp[maxn] ;

int   main(){
      int n , m , i , g  ,j , T = 1  , t ;
      cin>>t ;
      while(t--){
           cin>>n>>m ;
           g = 0 ;
           for(i = 1 ; i <= n ; i++){
                shouru[i].read() ;
                a[g++] = shouru[i].day ;
           }

           for(i = 1 ; i <= m ; i++){
                touzi[i].read() ;
                a[g++] = touzi[i].st  ;
                a[g++] = touzi[i].ed  ;
           }

           sort(a , a+g) ;
           g = unique(a , a+g) - a ;

           for(i = 0 ; i <= g ; i++) lis[i].clear() ;

           for(i = 1 ; i <= n ; i++)
               shouru[i].day = upper_bound(a , a+g , shouru[i].day) - a ;

           for(i = 1 ; i <= m ; i++){
               touzi[i].st  = upper_bound(a , a+g , touzi[i].st) - a ;
               touzi[i].ed  = upper_bound(a , a+g , touzi[i].ed) - a ;
               lis[touzi[i].st].push_back( make_pair(touzi[i].ed , touzi[i].value) ) ;
           }

           memset(money , 0 , sizeof(money)) ;
           for(i = 1 ; i <= n ; i++)  money[shouru[i].day] += shouru[i].money ;

           memset(dp ,  0 , sizeof(dp)) ;
           for(i = g ; i >= 1 ; i--){
               dp[i] = dp[i+1] ;
               for(j = 0 ; j < lis[i].size() ; j++)
                   dp[i] = max(dp[i] , dp[lis[i][j].first] + lis[i][j].second) ;
           }

           double sum = 0 ;
           for(i = 1 ; i <= g ; i++) sum += money[i] * dp[i] ;

           printf("Case #%d:\n%.2lf\n" , T++ , sum / 100 ) ;

      }

      return  0 ;
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值