POJ.1752.Advertisement(差分约束 最长路SPFA)
\(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)的更多相关文章
- poj 1752 Advertisement (差分约束)
题目大意:题目大意:有n个人在一条路上跑步,广告商准备在这条路上设置广告牌,假设这条路上每一个点有一个广告牌 现在已知这n个人从Ai开始跑,到Bi结束,那么他可以看到max(Ai,Bi)-min(Ai ...
- HDU.1529.Cashier Employment(差分约束 最长路SPFA)
题目链接 \(Description\) 给定一天24h 每小时需要的员工数量Ri,有n个员工,已知每个员工开始工作的时间ti(ti∈[0,23]),每个员工会连续工作8h. 问能否满足一天的需求.若 ...
- 【bzoj3436】小K的农场 差分约束系统+最长路-Spfa
原文地址:http://www.cnblogs.com/GXZlegend/p/6801470.html 题目描述 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总 ...
- 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 ...
- HDU4109-instruction agreement(差分约束-最长路+建立源点,汇点)
Ali has taken the Computer Organization and Architecture course this term. He learned that there may ...
- poj 1201 Intervals(差分约束)
题目:http://poj.org/problem?id=1201 题意:给定n组数据,每组有ai,bi,ci,要求在区间[ai,bi]内至少找ci个数, 并使得找的数字组成的数组Z的长度最小. #i ...
- POJ 3169 Layout (差分约束)
题意:给定一些母牛,要求一个排列,有的母牛距离不能超过w,有的距离不能小于w,问你第一个和第n个最远距离是多少. 析:以前只是听说过个算法,从来没用过,差分约束. 对于第 i 个母牛和第 i+1 个, ...
- [poj 3159]Candies[差分约束详解][朴素的考虑法]
题意 编号为 1..N 的人, 每人有一个数; 需要满足 dj - di <= c 求1号的数与N号的数的最大差值.(略坑: 1 一定要比 N 大的...difference...不是" ...
- POJ——3169Layout(差分约束)
POJ——3169Layout Layout Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14702 Accepted ...
随机推荐
- 用nodejs搭建BS环境
var http = require('http'); http.createServer(function (req, res) {res.writeHead(200, {'Content-Type ...
- mq命令帮助文档
https://www.ibm.com/support/knowledgecenter/zh/SSFKSJ_7.5.0/com.ibm.mq.ref.adm.doc/q083180_.htm
- linux系统下安装redis及配置
下载Redis redis-3.2.11.tar.gz 解压编译 tar xzf redis-3.2.11.tar.gz cd redis-3.2.11 make 编译完成之后,可以看到解压文件red ...
- Ex 6_20 最优二叉搜索树..._第六次作业
假设关键字的总数为n,用c[i,j]表示第i个关键字到第j个关键字的最优二叉查找树的代价,我们的目标是求c[0,n-1].要求c[i,j],首先要从第i个关键字到第j个关键字中选一个出来作为根结点,选 ...
- vue首次赋值不触发watch
可通过其immediate 属性进行配置,默认为false watch:{ "aaa":{ immediate:true, handler:function(){ } }
- system
system("cls"); //清屏 system("color f2") //改变控制台颜色 f2为颜色样式,可以是e2.f3等等 Original:htt ...
- poj1436水平可见线
还是线段树区间更新,这次不需要对线段离散化,但是要把线段纵坐标*2,可以举例模拟 #include<iostream> #include<cstring> #include&l ...
- %SystemRoot%
%SystemRoot%即C:\windows
- 步步为营-54-DOM
说明:DOM document object model 文档对象模型.将所有的标记加载到内存中,以树形结构处理 1.1 使用JavaScript操作DOM,主要包括两个部分 Browser对象:BO ...
- ERP产品购进批量提交文件(三十六)
商品录入前端的代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Pro ...