题目链接

\(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不能用来求最长路

//1240K	735MS
#include <queue>
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define mp std::make_pair
#define pr std::pair<int,int>
const int N=10005,M=60005,INF=0x3f3f3f3f; int n,K,Enum,H[N<<1],nxt[M],to[M],val[M],dis[N<<1];
bool vis[N<<1];
//std::priority_queue<pr> q;
std::queue<int> que; inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
inline void AddEdge(int u,int v,int w){
to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum, val[Enum]=w;
}
//int Dijkstra(int mn,int mx)
//{
// for(int i=mn+1; i<=mx; ++i) dis[i]=-INF;
// q.push(mp(0,mn));
// while(!q.empty())
// {
// int x=q.top().second;q.pop();
// if(vis[x]) continue;
// vis[x]=1;
// for(int i=H[x]; i; i=nxt[i])
// if(dis[to[i]]<dis[x]+val[i])
// {
// dis[to[i]]=dis[x]+val[i];
// if(!vis[to[i]]) q.push(mp(dis[to[i]],to[i]));
// }
// }
// return dis[mx];
//}
int SPFA(int mn,int mx)
{
for(int i=mn+1; i<=mx; ++i) dis[i]=-INF;
que.push(mn);
while(!que.empty())
{
int x=que.front();que.pop();
vis[x]=0;
for(int i=H[x]; i; i=nxt[i])
if(dis[to[i]]<dis[x]+val[i])
{
dis[to[i]]=dis[x]+val[i];
if(!vis[to[i]]) que.push(to[i]),vis[to[i]]=1;
}
}
return dis[mx];
} int main()
{
K=read(),n=read();
int mx=0,mn=N<<1;
for(int st,ed,t,i=1; i<=n; ++i)
{
st=read()+N, ed=read()+N;
if(st>ed) std::swap(st,ed);
mn=std::min(mn,--st), mx=std::max(mx,ed);
if((t=ed-st)<K) AddEdge(st,ed,t),AddEdge(ed,st,-t);
else AddEdge(st,ed,K);
}
mn-=2;
for(int i=mn; i<=mx; ++i) AddEdge(i-1,i,0),AddEdge(i,i-1,-1);
printf("%d\n",SPFA(mn,mx));
for(int i=mn; i<=mx; ++i)
if(dis[i]==dis[i-1]+1) printf("%d\n",i-N);
return 0;
}

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. C++:vector中的v.at(0)和v[0]的区别

    设v是一个vector的对象, 如果v是非空的,则v.at(0)和v[0]是没有区别的,都是取数组中第一个值: 如果v是空的,则v.at(0)会抛出异常(exception std::out_of_r ...

  2. JOptionPane类提示框常用方法总结

    JOptionPane类封装了很多的方法,总结如下: 1.showMessageDialog 显示一个带有OK 按钮的模态对话框. 下面是几个使用showMessageDialog 的例子: Java ...

  3. 解决maven编译Java中的使用了未经检查或不安全的操作

    eclipse编译器找到右侧黄色点击可以定位到对应代码块位置 解决方法:鼠标悬浮在上方点击add即可 @SuppressWarnings("unchecked");给出的解决方案 ...

  4. unicode-range特定字符使用font-face自定义字体

    链接: https://www.zhangxinxu.com/wordpress/2016/11/css-unicode-range-character-font-face/

  5. java多线程快速入门(十六)

    ThreadLocal关键字实现每个线程有自己的变量 package com.cppdy; class Number { private int num; public static ThreadLo ...

  6. system

    system("cls"); //清屏 system("color f2") //改变控制台颜色 f2为颜色样式,可以是e2.f3等等 Original:htt ...

  7. 对以内部 git 仓库为 composer 依赖的 package,加上版本号

    现实问题 之前同事做了一个 composer package,做为公司大量 laravel 项目的通用模块. 但是,在实际使用中,每个项目对改 package 的依赖版本是有所不同的.否则 compo ...

  8. python 全栈开发,Day61(库的操作,表的操作,数据类型,数据类型(2),完整性约束)

    昨日内容回顾 一.回顾 定义:mysql就是一个基于socket编写的C / S架构的软件 包含: ---服务端软件 - socket服务端 - 本地文件操作 - 解析指令(mysql语句) ---客 ...

  9. 步步为营-30-AES加密与解密

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  10. [转] 插件兼容CommonJS, AMD, CMD 和 原生 JS

    模块标准 CommonJS CommonJS 有三个全局变量 module.exports 和 require.但是由于 AMD 也有 require 这个全局变量,故不使用这个变量来进行检测. 如果 ...