提交时间:2024-05-07 13:50:10

运行 ID: 146040

#include<bits/stdc++.h> using namespace std; int n , m , k , x [10005] , y [10005] , low [10005] , high [10005] , f [10005] [2005] ; bool flag [10005] ; int main ( ) { cin >> n >> m >> k ; for ( int i = 1 ; i <= n ; i ++ ) { cin >> x [i] >> y [i] ; } memset ( high , m , n + 1 ) ; memset ( low , 1 , n + 1 ) ; for ( int i = 1 ; i <= k ; i ++ ) { int p , l , h ; cin >> p >> l >> h ; flag [p] = 1 ; low [p] = l + 1 ; high [p] = h - 1 ; } memset ( f , 0x3f3f3f , sizeof ( f ) ) ; for ( int i = 1 ; i <= m ; i ++ ) { f [0] [i] = 0 ; } for ( int i = 1 ; i <= n ; i ++ ) { for ( int j = x [i] + 1 ; j <= x [i] + m ; j ++ ) { f [i] [j] = min ( f [i - 1] [j - x [i]] + 1 , f [i] [j - x [i]] + 1 ) ; } for ( int j = m + 1 ; j <= x [i] + m ; j ++ ) { f [i] [m] = min ( f [i] [m] , f [i] [j] ) ; } for ( int j = 1 ; j <= m - y [i] ; j ++ ) { f [i] [j] = min ( f [i] [j] , f [i - 1] [j + y [i]] ) ; } for ( int j = 1 ; j < low [i] ; j ++ ) { f [i] [j] = 0x3f3f3f ; } for ( int j = high [i] + 1 ; j <= m ; j ++ ) { f [i] [j] = 0x3f3f3f ; } } int ans = 0x3f3f3f ; for ( int i = 1 ; i <= m ; i ++ ) { ans = min ( ans , f [n] [i] ) ; } if ( ans < 0x3f3f3f ) { cout << 1 << endl << ans << endl ; } else { ans = 0 ; for ( int i = 1 ; i <= n ; i ++ ) { for ( int j = 1 ; j <= m ; j ++ ) { if ( flag [i] && f [i] [j] < 0x3f3f3f ) { ans ++ ; break ; } } } cout << 0 << endl << ans << endl ; } return 0 ; }