信息
- ID
- 744
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 67
- 已通过
- 15
- 上传者
/*****************************************
备注:
******************************************/
#include<queue>
#include<math.h>
#include<stack>
#include<stdio.h>
#include<iostream>
#include<vector>
#include<iomanip>
#include<map>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN = 1e4 + 5;
const int MR = 2e3 + 5;
const int INF = 0x3f3f3f3f;
const int MOD = 998244353;
int n, m, k;
int x[MAXN], y[MAXN];
int high[MAXN], low[MAXN];
bool flag[MAXN];
int dp[MAXN][MR];
signed main()
{
cin >> n >> m >> k;
for(int i = 1;i <= n; i++)
{
cin >> x[i] >> y[i];
}
for(int i = 1;i <= n; i++)
{
//平路
high[i] = m;
low[i] = 1;
}
for(int i = 1, xx, yy, zz;i <= k; i++)
{
cin >> xx >> yy >> zz;
high[xx] = zz - 1;
low[xx] = yy + 1;
flag[xx] = 1;
}
memset(dp, INF, sizeof dp);
for(int i = 1;i <= m; i++)
{
dp[0][i] = 0;
}
for(int i = 1;i <= n; i++)
{
//上去
for(int j = x[i] + 1;j <= x[i] + m; j++)
{
dp[i][j] = min(dp[i - 1][j - x[i]] + 1, dp[i][j - x[i]] + 1);
}
//顶端
for(int j = m + 1;j <= x[i] + m; j++)
{
dp[i][m] = min(dp[i][m], dp[i][j]);
}
//飞过了
for(int j = 1;j <= m - y[i]; j++)
{
dp[i][j] = min(dp[i - 1][j + y[i]], dp[i][j]);
}
//下去
for(int j = 1;j < low[i]; j++)
{
dp[i][j] = INF;
}
for(int j = high[i] + 1;j <= m; j++)
{
dp[i][j] = INF;
}
}
int ans = INF;
for(int i = 1;i <= m; i++)
{
ans = min(ans, dp[n][i]);
}
if(ans < INF)
{
cout << 1 << endl << ans;
return 0;
}
ans = 0;
int i, j;//在哪一个横坐标掉下去
for(i = n; i >= 1; i--)
{
for(j = 1; j <= m; j++)
{
if(dp[i][j] < INF)break;
}
if(j <= m)break;
}
for(int k = 1;k <= i; k++)
{
if(flag[k])ans++;
}
cout << 0 << endl << ans;
return 0;
}