常规的dp,当前有值且碰不到管子就转移,可以连跳的操作我就加了一维表示当前是不是连跳过来的。第二问前缀和即可得(不对啊边走边记录就行了吧我冗了Orz)。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = 1e4 + 5, maxm = 1e3 + 5;
const int inf = 0x3f3f3f3f;
int n, m, k;
int dp[maxn][maxm][2], cnt[maxn];
pair<int, int> go[maxn], limit[maxn]; int Judge() {
int res = inf;
for (int j = 1; j <= m; j++) {
res = min(res, dp[n][j][0]);
}
return res;
} int main() {
scanf("%d%d%d", &n, &m, &k); for (int i = 0; i < n; i++) {
int up, down;
scanf("%d %d", &up, &down);
go[i] = {up, down};
limit[i] = {1, m};
}
limit[n] = {1, m};
for (int i = 0; i < k; i++) {
int j, l, r;
scanf("%d %d %d", &j, &l, &r);
limit[j] = {l + 1, r - 1};
cnt[j]++;
} for (int i = 1; i <= n; i++) {
for (int j = 0; j <= m; j++){
dp[i][j][0] = dp[i][j][1] = inf;
}
}
for (int i = 0; i < n; i++) {
for (int j = 1; j <= m; j++) {
for (int k = 0; k <= 1; k++) {
if (dp[i][j][k] != inf) {
int high = min(j + go[i].first, m);
if (high >= limit[i + 1].first && high <= limit[i + 1].second)
dp[i + 1][high][0] = min(dp[i + 1][high][0], dp[i][j][k] + 1);
dp[i][high][1] = min(dp[i][high][1], dp[i][j][k] + 1); int low = j - go[i].second;
if (!k && low >= limit[i + 1].first && low <= limit[i + 1].second)
dp[i + 1][low][0] = min(dp[i + 1][low][0], dp[i][j][k]);
}
}
}
} int ans = Judge();
if (ans == inf) {
for (int i = n - 1; i >= 0; i--) {
for (int j = 1; j <= m; j++) {
if (dp[i][j][0] != inf) {
for (int t = 1; t <= n; t++) cnt[t] += cnt[t - 1];
printf("0\n%d\n", cnt[i]);
return 0;
}
}
}
} else {
printf("1\n%d\n", ans);
} return 0;
}

最新文章

  1. 原生js事件委托
  2. linux下的/dev/shm目录
  3. CE5 WiFi开关
  4. cocos2dx3.0 removeFromParent和removeAllChildren含义
  5. eclipse android 不会自动生成R.java文件和包的解决办法
  6. Flash安全的一些总结
  7. synchronized关键字
  8. SQLServer2008修改sa密码的方法与SQL server 2008数据库的备份与还原
  9. ASP.NET MVC编程——视图
  10. MySQL-压缩版-windows安装
  11. 阿里云MySQL远程连接不上问题
  12. jdk版本相关问题
  13. Thymeleaf的一些操作
  14. mysql for循环存储过程
  15. fmt.printf输出的格式
  16. QT 实现图片旋转的两种方法
  17. php 获取读取文件内容
  18. Python 函数介绍
  19. ISP与DSP的区别【转】
  20. mtk 无线配置文件生效过程

热门文章

  1. 高精度乘法(FFT)
  2. 数据结构之 字符串---字符串匹配(kmp算法)
  3. Linux档案属性
  4. Linux-用户和权限
  5. 三剑客之awk数组实战
  6. BZOJ_1004_[HNOI2008]Cards_burnside+DP
  7. BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt
  8. BZOJ_3489_ A simple rmq problem_KDTree
  9. codevs 3012 线段覆盖4
  10. c++之函数值传递和引用传递解析----关键在于理解函数return的实现机制(内存分配)