#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int x[10005],y[10005];
int low[10005],high[10005];
int dp[10005][2005];
int ans = 0x3f3f3f3f;
int main(){
memset(dp,0x3f,sizeof(dp));
cin >> n >> m >> k;
for(int i=1;i<=n;i++){
dp[0][i] = 0;
}
for(int i=1;i<=n;i++){
high[i] = m;
low[i] = 1;
cin >> x[i] >> y[i];
}
for(int i=1;i<=k;i++){
int p,l,h;
cin >> p >> l >> h;
low[p] = l+1;
high[p] = h-1;
}
for(int i=1;i<=n;i++){
for(int j=x[i]+1;j<=x[i]+m;j++){
if(j <= m) dp[i][j] = min(dp[i-1][j-x[i]]+1,dp[i][j-x[i]]+1);
else dp[i][m] = min(dp[i][m],min(dp[i-1][j-x[i]]+1,dp[i][j-x[i]]+1));
}
for(int j=1;j<=m-y[i];j++){
dp[i][j] = min(dp[i][j],dp[i-1][j+y[i]]);
}
for(int j=1;j<low[i];j++){
dp[i][j] = 0x3f3f3f3f;
}
for(int j=high[i]+1;j<=m;j++){
dp[i][j] = 0x3f3f3f3f;
}
}
for(int i=1;i<=m;i++){
ans = min(ans,dp[n][i]);
}
if(ans < 0x3f3f3f3f){
cout << 1 << endl << ans;
return 0;
}else{
for(int i=n;i>=1;i--){
for(int j=1;j<=m;j++){
if(dp[i][j] < 0x3f3f3f3f){
int cnt = 0;
for(int k=1;k<=i;k++){
if(low[k] != 1||high[k] != m) cnt++;
}
cout << 0 << endl << cnt;
return 0;
}
}
}
}
return 0;
}
输入
6 8 0
4 1
3 6
6 5
3 5
3 2
3 5
答案
1
2
我的答案
1
2