离散化
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 ;
}