题目链接

\(Description\)

有\(n\)个人在一条直线上跑步,每个人的起点 \(Si\)、终点 \(Ei\) 已知;每个点可以放一个广告牌,一个人\(i\)能看到的广告牌数量为 \(Ei-Si+1\)。

要求使每个人看到的广告牌数量不小于 \(k\) (若 \(Ei-Si+1<k\) 则应看到 \(Ei-Si+1\))。输出最少需要多少广告牌及方案。

(这翻译2333)

\(Solution\)

设 \(Sum_i\) 表示在 \([1,i]\) 广告牌总数,那么由题意有 \(Sum_{Ei}-Sum_{Si-1}>=k\),这是对于 \(Ei-Si+1>=k\) 的

设 \(C=Ei-Si+1\),若C<k,则 \(Sum_{Ei}-Sum_{Si-1}=C\),拆成两个式子

同时每个位置的限制 \(0<=Sum_i-Sum_{i-1}<=1\)

以 \(Sum_i\) 为点建边,求 \(Sum_0\) -> \(Sum_n\) 的最长路即为最少需要数量

输出方案: 若\(i\)处建了广告牌,则有 \(dis_i-dis_{i-1}=1\)

注意,Dijkstra不能用来求最长路

  1. //1240K 735MS
  2. #include <queue>
  3. #include <cstdio>
  4. #include <cctype>
  5. #include <algorithm>
  6. #define gc() getchar()
  7. #define mp std::make_pair
  8. #define pr std::pair<int,int>
  9. const int N=10005,M=60005,INF=0x3f3f3f3f;
  10. int n,K,Enum,H[N<<1],nxt[M],to[M],val[M],dis[N<<1];
  11. bool vis[N<<1];
  12. //std::priority_queue<pr> q;
  13. std::queue<int> que;
  14. inline int read()
  15. {
  16. int now=0,f=1;register char c=gc();
  17. for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
  18. for(;isdigit(c);now=now*10+c-'0',c=gc());
  19. return now*f;
  20. }
  21. inline void AddEdge(int u,int v,int w){
  22. to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum, val[Enum]=w;
  23. }
  24. //int Dijkstra(int mn,int mx)
  25. //{
  26. // for(int i=mn+1; i<=mx; ++i) dis[i]=-INF;
  27. // q.push(mp(0,mn));
  28. // while(!q.empty())
  29. // {
  30. // int x=q.top().second;q.pop();
  31. // if(vis[x]) continue;
  32. // vis[x]=1;
  33. // for(int i=H[x]; i; i=nxt[i])
  34. // if(dis[to[i]]<dis[x]+val[i])
  35. // {
  36. // dis[to[i]]=dis[x]+val[i];
  37. // if(!vis[to[i]]) q.push(mp(dis[to[i]],to[i]));
  38. // }
  39. // }
  40. // return dis[mx];
  41. //}
  42. int SPFA(int mn,int mx)
  43. {
  44. for(int i=mn+1; i<=mx; ++i) dis[i]=-INF;
  45. que.push(mn);
  46. while(!que.empty())
  47. {
  48. int x=que.front();que.pop();
  49. vis[x]=0;
  50. for(int i=H[x]; i; i=nxt[i])
  51. if(dis[to[i]]<dis[x]+val[i])
  52. {
  53. dis[to[i]]=dis[x]+val[i];
  54. if(!vis[to[i]]) que.push(to[i]),vis[to[i]]=1;
  55. }
  56. }
  57. return dis[mx];
  58. }
  59. int main()
  60. {
  61. K=read(),n=read();
  62. int mx=0,mn=N<<1;
  63. for(int st,ed,t,i=1; i<=n; ++i)
  64. {
  65. st=read()+N, ed=read()+N;
  66. if(st>ed) std::swap(st,ed);
  67. mn=std::min(mn,--st), mx=std::max(mx,ed);
  68. if((t=ed-st)<K) AddEdge(st,ed,t),AddEdge(ed,st,-t);
  69. else AddEdge(st,ed,K);
  70. }
  71. mn-=2;
  72. for(int i=mn; i<=mx; ++i) AddEdge(i-1,i,0),AddEdge(i,i-1,-1);
  73. printf("%d\n",SPFA(mn,mx));
  74. for(int i=mn; i<=mx; ++i)
  75. if(dis[i]==dis[i-1]+1) printf("%d\n",i-N);
  76. return 0;
  77. }

POJ.1752.Advertisement(差分约束 最长路SPFA)的更多相关文章

  1. poj 1752 Advertisement (差分约束)

    题目大意:题目大意:有n个人在一条路上跑步,广告商准备在这条路上设置广告牌,假设这条路上每一个点有一个广告牌 现在已知这n个人从Ai开始跑,到Bi结束,那么他可以看到max(Ai,Bi)-min(Ai ...

  2. HDU.1529.Cashier Employment(差分约束 最长路SPFA)

    题目链接 \(Description\) 给定一天24h 每小时需要的员工数量Ri,有n个员工,已知每个员工开始工作的时间ti(ti∈[0,23]),每个员工会连续工作8h. 问能否满足一天的需求.若 ...

  3. 【bzoj3436】小K的农场 差分约束系统+最长路-Spfa

    原文地址:http://www.cnblogs.com/GXZlegend/p/6801470.html 题目描述 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总 ...

  4. HDU1529-Casher Emploryment(最最...最经典的差分约束 差分约束-最长路+将环变线)

    A supermarket in Tehran is open 24 hours a day every day and needs a number of cashiers to fit its n ...

  5. HDU4109-instruction agreement(差分约束-最长路+建立源点,汇点)

    Ali has taken the Computer Organization and Architecture course this term. He learned that there may ...

  6. poj 1201 Intervals(差分约束)

    题目:http://poj.org/problem?id=1201 题意:给定n组数据,每组有ai,bi,ci,要求在区间[ai,bi]内至少找ci个数, 并使得找的数字组成的数组Z的长度最小. #i ...

  7. POJ 3169 Layout (差分约束)

    题意:给定一些母牛,要求一个排列,有的母牛距离不能超过w,有的距离不能小于w,问你第一个和第n个最远距离是多少. 析:以前只是听说过个算法,从来没用过,差分约束. 对于第 i 个母牛和第 i+1 个, ...

  8. [poj 3159]Candies[差分约束详解][朴素的考虑法]

    题意 编号为 1..N 的人, 每人有一个数; 需要满足 dj - di <= c 求1号的数与N号的数的最大差值.(略坑: 1 一定要比 N 大的...difference...不是" ...

  9. POJ——3169Layout(差分约束)

    POJ——3169Layout Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14702   Accepted ...

随机推荐

  1. STM32 变量无法赋值问题

    STM32 在用JLink 调试的时候发现有一条将unsigned char赋值给int的语句始终不能执行,int类型变量的值始终为0: 查资料找到这个问题是编译器优化的原因,也就是说由于编译器优化, ...

  2. spring mvc常用配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  3. cmake 使用

    1.cmake 显示编译命令: 在顶层CMakeLists.txt里设置 set(CMAKE_VERBOSE_MAKEFILE ON) 或者  cmake .        再           m ...

  4. Graphql 相关 strapi -- Koa2

    Graphql  相关资源:     https://github.com/chentsulin/awesome-graphql graphql-apis       :     https://gi ...

  5. Eclipse与github整合

    Eclipse与github整合 Windows系统下: github官方指南:https://help.github.com/articles/set-up-git Git?是个正快速成长的版本控制 ...

  6. Buffer学习笔记.

    前言 JavaScript 对于字符串的操作十分便捷,无论是单字节字符还是宽字节字符,都会认为是一个字符.对字符串的简单操作和DOM操作基本上已经可以满足前端工程需求,但Node很多时候需要处理文件和 ...

  7. LeetCode(47):全排列 II

    Medium! 题目描述: 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ] 解题思路: 这道 ...

  8. appium自动化测试之元素定位

    方法一 使用SDK中附带的uiautomatorviewer来定位 在SDK安装目录下的tools下有个uiautomatorviewer.bat批处理文件点击运行 运行后(注意appium desk ...

  9. 阿里巴巴 Java 开发手册评述

    http://blog.jobbole.com/110427 阿里巴巴Java开发手册(终极版)https://pan.baidu.com/s/1c1UQM7Q 阿里巴巴Java开发规约插件p3cGi ...

  10. 记一次Oracle分区表错误:ORA-14400: 插入的分区关键字未映射到任何分区

    https://blog.csdn.net/xdyzgjy/article/details/42238735