码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 《算法竞赛进阶指南》差分约束 区间


    给定 n 个区间 [ai,bi] 和 n 个整数 ci。

    你需要构造一个整数集合 Z,使得 ∀i∈[1,n],Z 中满足 ai≤x≤bi 的整数 x 不少于 ci 个。

    求这样的整数集合 Z 最少包含多少个数。

    输入格式

    第一行包含整数 n。

    接下来 n 行,每行包含三个整数 ai,bi,ci。

    输出格式

    输出一个整数表示结果。

    数据范围

    1≤n≤50000,
    0≤ai,bi≤50000,
    1≤ci≤bi−ai+1

    输入样例:

    1. 5
    2. 3 7 3
    3. 8 10 3
    4. 6 8 1
    5. 1 3 1
    6. 10 11 1

    输出样例:

    6

    典型的差分约束问题若不懂差分约束的可以看看这篇:(15条消息) 《图论:差分约束算法详解 + 算法证明》+ 模板题:糖果_wsh1931的博客-CSDN博客

    首先他求的是最小值,所以我们要用最长路

    假设:s[i]为从1 - i 中选择了多少个数

    题目给的数据范围是从0 - 5000我们为了遍历到所有点,即建立超级源点可以将0 - 50000映射成1 - 50001;

    由题意我们可以得到上述结论

    1: s[0] = 0

    2: s[i] - s[i - 1] <= 1(即第i个数最多只能选一个)-> s[i - 1] >= s[i] - 1;

    3: s[b] - s[a - 1] >= c (a, b, c)为题目输入的从区间[a, b]中选择的数不少于c个 -> s[b] >= s[a - 1] + c

    4: s[i] >= s[i - 1] (即从前i个数中选择的数比从前i - 1个数中选择的数多)

    又因为答案肯定有解,所以不需要判断是否无解

    然后我们验证一下从源点出发是不是可以遍历所有点由结论4可以我们可以从0 -> 1. 1-> 2......n - 1 -> n因此可以遍历所有点

    建图的边数:结论2, 3, 4所需要建立的边数各位N所以总共需要建立3 * N条边

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. const int N = 50010, M = 3 * N;
    7. int n;
    8. bool st[N];
    9. int dist[N];
    10. int h[N], e[M], ne[M], w[M], idx;
    11. void add(int a, int b, int c)
    12. {
    13. e[idx] = b;
    14. w[idx] = c;
    15. ne[idx] = h[a];
    16. h[a] = idx;
    17. idx ++ ;
    18. }
    19. void spfa()//求最小值用最长路
    20. {
    21. memset(dist, -0x3f, sizeof dist);
    22. dist[0] = 0;
    23. queue<int> q;
    24. q.push(0);
    25. while (q.size())
    26. {
    27. auto t = q.front();
    28. q.pop();
    29. st[t] = false;
    30. for (int i = h[t]; i != -1; i = ne[i])
    31. {
    32. int j = e[i];
    33. if (dist[j] < dist[t] + w[i])
    34. {
    35. dist[j] = dist[t] + w[i];
    36. if (!st[j])
    37. {
    38. st[j] = true;
    39. q.push(j);
    40. }
    41. }
    42. }
    43. }
    44. }
    45. int main()
    46. {
    47. cin >> n;
    48. memset(h, -1, sizeof h);
    49. for (int i = 1; i < N; i ++ )//结论2,4;
    50. {
    51. add(i, i - 1, -1);
    52. add(i - 1, i, 0);
    53. }
    54. int res = 0;
    55. while (n -- )
    56. {
    57. int a, b, c;
    58. scanf("%d %d %d", &a, &b, &c);
    59. a ++ , b ++ ;//将0 - 50000映射成1 - 50001
    60. res = max(res, b);//求出前res个数中至少选择了多少个数
    61. add(a - 1, b, c);
    62. }
    63. spfa();
    64. cout << dist[res] << endl;//前res个数中共选择了多少个数
    65. return 0;
    66. }

  • 相关阅读:
    狗都能看懂的CenterNet讲解及代码复现
    C++模拟与高精度——帮贡排序
    李廉洋:6.3黄金原油美盘尾盘分析及最新动向分析;
    达梦数据库如何查看历史sql
    Shell编程-01
    node的api使用——URL——get方法——网页爬虫——node事件——path路径——判断文件类型——fs四种异步封装——客户端文件验证发送
    一棵有点自律的树——搜索二叉树
    CTFshow 命令执行 web29 30 31
    vue中screenfull组件实现全屏和非全屏+怎么给页面全屏加一张图片且不需要设置js获取页面高度
    限流神器之-Guava RateLimiter 实战
  • 原文地址:https://blog.csdn.net/qq_61935738/article/details/126686639
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号