WA65分求助!
查看原帖
WA65分求助!
1312482
Delightedppp楼主2025/8/3 08:08
#include<bits/stdc++.h> 
using namespace std ; 
#define int  long long 
const int N = 1e4 + 11 ;
int n , m , k , x[N] , y[N] , l[N] , r[N] , dp[N][1003] , ans[N] , cnt ; 
bool vis [N] ;
signed main ( ) {
	cin >> n >> m >> k ;
	for (int i = 1 ; i <= n ; i ++ )
		cin >> x[i] >> y[i] ;
	for (int i = 1 ; i <= k ; i ++ ) {
		int p , a , b ;
		cin >> p >> a >> b ;
		l[p] = a ;
		r[p] = b ;
		vis[p] = 1 ;
	} 
	for (int i = 0 ; i <= n ; i ++ ) {
		if (! l[i] && ! r[i] ) {
			l[i] = 0 ;
			r[i] = 2 * m + 1 ;
		}
	}
	memset (ans , 0x3f ,sizeof ans ) ;
	memset (dp , 0x3f , sizeof dp ) ; 
	ans[0] = 0 ;
	for (int i = 1 ;i <= m ; i ++ ) 
		dp[0][i] = 0 ;
	for (int i = 1 ; i <= n ; i ++ ) {
		for (int j = l[i] + 1 ; j < r[i] ; j ++ ) {	
			if (j - x[i] > 0) 
				dp[i][min (j , m) ] = min (dp[i][min (j , m ) ] , dp[i - 1][j - x[i] ] + 1 ) ;	
			for (int K = 2 ; ; K *= 2  ) {
				if (j - K * x[i] > 0 )
					dp[i][min (j , m) ] = min (dp[i][min (j , m ) ] , dp[i][j - K * x[i] ] + K ) ;	
				else 
					break ;	
			}
			if (j + y[i] < min (r[i - 1] , m + 1 ) )
				dp[i][j] = min (dp[i][j] , dp[i - 1][j + y[i] ] ) ;	
			ans[i] = min (dp[i][j] , ans[i] ) ;
		}
	}
//	for (int  i = 0 ; i <= n ; i ++ ) {
//		for (int j = 1 ; j <= m ; j ++ ) {
//			cout << dp[i][j] << " " ;
//		}
//		cout << endl ;
//	}
	if (ans[n] > 1e8 ) {
		cout << 0 << endl ;
		for (int i = n - 1 ; i >= 0 ; i -- ) {
			if (ans[i] <= 1e8){
				cout << k - cnt << endl ; 
				return 0 ;
			}
			cnt += vis[i] ;
		}
	}
	else {
		cout << 1 << endl ;
		cout << ans[n] <<endl; 
	}
 	return 0 ;
}

2025/8/3 08:08
加载中...