#include <cstdio>
#include <cstring>
#include <algorithm>
#define File(_) freopen(#_".in", "r", stdin);freopen(#_".out", "w", stdout)
#define Debug(_) freopen(#_".in", "r", stdin);freopen("debug.out", "w", stdout)
#define fo(i, a, b) for (int i = a; i <= b; ++i)
#define fd(i, a, b) for (int i = a; i >= b; --i)
#define N 10010
#define M 1010
#define mod
#define inf 0x3f3f3f3f
#define db double
#define ll long long
#define gc getchar()
#define init(a, b) memset(a, b, sizeof a)
using namespace std;
int up[N], down[N], wall[N], top[N], floor[N];
int f[N][M][2];
int main()
{
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
fo (i, 0, n - 1)
{
scanf("%d%d", &up[i], &down[i]);
top[i] = m + 1;
}
top[n] = m + 1;
fo (i, 1, k)
{
scanf("%d", &wall[i]);
scanf("%d %d", &floor[wall[i]], &top[wall[i]]);
}
init(f, 0x3f);
fo (i, 0, m)
f[0][i][1] = f[0][i][0] = 0;
fo (i, 0, n - 1)
fo (j, floor[i] + 1, top[i] - 1)
{
int nex = j - down[i];
if (nex > floor[i + 1] && nex < top[i + 1])
f[i + 1][nex][0] = min(f[i + 1][nex][0], min(f[i][j][0], f[i][j][1]));
nex = min(m, j + up[i]);
if (nex > floor[i + 1] && nex < top[i + 1])
f[i + 1][nex][1] = min(f[i + 1][nex][1], min(f[i][j][0], f[i][j][1]) + 1);
nex = min(m, j + up[i - 1]);
if (nex > floor[i] && nex < top[i])
f[i][nex][1] = min(f[i][nex][1], f[i][j][1] + 1);
}
int ans = inf;
fo (i, 1, m)
ans = min(ans, min(f[n][i][0], f[n][i][1]));
if (ans != inf)
printf("1\n%d", ans);
else
{
sort(wall + 1, wall + k + 1);
printf("0\n");
fo (i, 1, k)
{
int ok = 0;
fo (j, floor[wall[i]] + 1, top[wall[i]] - 1)
if (f[wall[i]][j][0] != inf || f[wall[i]][j][1] != inf)
{
ok = 1;
break;
}
if (!ok)
{
printf("%d", i - 1);
break;
}
}
}
return 0;
}
我的思路可能有些不一样,主要就是用当前的点去转移这个点往下掉的点,跳一次的点,和跳到这个点之前再跳一次的点,结果WA75pts,不知道是思路错了还是代码错了,求大佬指出