传送门:

http://acm.hdu.edu.cn/showproblem.php?pid=1384

Intervals

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4841    Accepted Submission(s): 1815

Problem Description
You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn.

Write a program that:

> reads the number of intervals, their endpoints and integers c1, ..., cn from the standard input,

> computes the minimal size of a set Z of integers which has at least ci common elements with interval [ai, bi], for each i = 1, 2, ..., n,

> writes the answer to the standard output

 
Input
The first line of the input contains an integer n (1 <= n <= 50 000) - the number of intervals. The following n lines describe the intervals. The i+1-th line of the input contains three integers ai, bi and ci separated by single spaces and such that 0 <= ai <= bi <= 50 000 and 1 <= ci <= bi - ai + 1.

Process to the end of file.

 
Output
The output contains exactly one integer equal to the minimal size of set Z sharing at least ci elements with interval [ai, bi], for each i = 1, 2, ..., n.
 
Sample Input
5
3 7 3
8 10 3
6 8 1
1 3 1
10 11 1
 
Sample Output
6
 
Author
1384
 
Recommend
Eddy   |   We have carefully selected several similar problems for you:  1529 1531 1548 1534 1317 
题目意思:
给出 n 个区间,每个区间有个权值 Ci,最终找出一个最少的数字的集合,使得满足每个区间中至少包含 Ci 个数。
给你几组的a,b,c
从区间a到b(闭区间)选择至少c个数放入集合
要求集合中的数字最少,问你最少多少个数字
 
分析:
f(a)表示从0到a有f(a)个数放入集合
那么a,b,c根据不等式建立边
f(b)-f(a-1)>=c
 
这个不等式的意思是:从区间a,b里面选择至少c个数加入集合
隐藏的不等式:0<=f(i)-f(i-1)<=1
 
变形一下:
f(i)-f(i-1)>=0
f(i-1)-f(i)>=-1
 
根据这三个不等式建立边
找到区间在最左端:minn
找到区间的最右端:maxx
所以这样建立边的话,跑最短路的时候
起点应该是max,终点是min-1
f(max)-f(min-1)>=x
x就是我们需要的结果
code:
#include <iostream>
#include <cstdio>
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<memory>
#include<queue>
#include<vector>
using namespace std;
#define max_v 50010
#define INF 9999999
int tot;
int head[max_v];
int vis[max_v];
int dis[max_v];
int minn,maxx;
struct node
{
int u,v,val;
int next;
}Edge[max_v<<];
void addEdge(int u,int v,int val)
{
Edge[tot].u=u;
Edge[tot].v=v;
Edge[tot].val=val;
Edge[tot].next=head[u];
head[u]=tot++;
}
void spfa()
{
for(int i=minn-;i<=maxx;i++)
dis[i]=-INF;
queue<int> q;
dis[maxx]=;
vis[maxx]=;
q.push(maxx);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=;
for(int i=head[u];i!=-;i=Edge[i].next)
{
int v=Edge[i].v;
if(dis[v]<dis[u]+Edge[i].val)
{
dis[v]=dis[u]+Edge[i].val;
if(!vis[v])
{
vis[v]=;
q.push(v);
}
}
}
}
printf("%d\n",dis[minn-]);
return ;
}
int main()
{
int n,a,b,c;
while(~scanf("%d",&n))
{
tot=;
memset(head,-,sizeof(head));
memset(vis,,sizeof(vis));
maxx=;
minn=INF;
for(int i=;i<n;i++)
{
scanf("%d %d %d",&a,&b,&c);
a++;
b++;
minn=min(minn,a);
maxx=max(maxx,b);
addEdge(b,a-,c);
}
for(int i=minn;i<=maxx;i++)
{
addEdge(i,i-,);
addEdge(i-,i,-);
}
spfa();
}
return ;
}

今天学差分约束的时候又遇到了这个题,跑最长路初始化的时候搞错了,应该是dis[i]=-INF。。。。,卡了好一会

题目意思:
从一系列区间[a,b]中每个至少取ci个数构成集合s,问你集合s至少需要多少个数
区间约束问题,差分约束解决
分析:
f(x):[0,x]区间内取f(x)个数
则区间[a,b]内至少取c个数可以变形为:f(b)-f(a-1)>=c
隐藏关系:1>=f(i)-f(i-1)>=0,变形一下:
f(i)-f(i-1)>=0
f(i-1)-f(i)>=-1
maxx:所有区间的最大值
minx:所有区间的最小值
i属于[minx,maxx]
总结一下得到这样三个关系:
f(b)-f(a-1)>=c
f(i)-f(i-1)>=0  i属于[minx,maxx]
f(i-1)-f(i)>=-1 i属于[minx,maxx]
这三个表达式的形式都是一样的,xi-xj>=c
按照j->i建边,权值为c
所以:
(a-1)->b 建边 权值c
(i-1)->i 建边 权值0
i->(i-1) 建边 权值-1
我们要求的东西ans可以变形为:f(maxx)-f(minx-1)>=ans
>=是最小值,所以是最长路
所以是问你从minx-1到maxx的最长路
建图完毕之后spfa跑一遍最长路,不能用dj,因为存在负权边
code:
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<string.h>
#include<set>
#include<map>
#include<list>
#include<math.h>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long LL;
#define INF 9999999999
#define me(a,x) memset(a,x,sizeof(a))
int mon1[]= {,,,,,,,,,,,,};
int mon2[]= {,,,,,,,,,,,,};
int dir[][]= {{,},{,-},{,},{-,}}; int getval()
{
int ret();
char c;
while((c=getchar())==' '||c=='\n'||c=='\r');
ret=c-'';
while((c=getchar())!=' '&&c!='\n'&&c!='\r')
ret=ret*+c-'';
return ret;
}
void out(int a)
{
if(a>)
out(a/);
putchar(a%+'');
} #define max_v 50005
int dis[max_v];
int vis[max_v]; struct node
{
int v,w;
node(int vv=,int ww=):v(vv),w(ww){}
};
vector<node> G[max_v];
int n,m; void init()
{
for(int i=;i<max_v;i++)
G[i].clear();
for(int i=;i<max_v;i++)
{
dis[i]=-INF;
vis[i]=;
}
} void spfa(int s)
{ queue<int> q;
q.push(s);
vis[s]=;
dis[s]=; while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=; for(int j=;j<G[u].size();j++)
{
int v=G[u][j].v;
int w=G[u][j].w;
if(dis[v]<dis[u]+w)//最长路
{
dis[v]=dis[u]+w;
if(vis[v]==)
{
vis[v]=;
q.push(v);
}
}
}
}
} int f(int u,int v)
{
for(int j=;j<G[u].size();j++)
{
if(G[u][j].v==v)
return ;
}
return ;
}
int main()
{
int a;
while(~scanf("%d",&a))
{
int x,y,w;
init();
int maxx=-INF,minx=INF;
for(int i=;i<=a;i++)
{
scanf("%d %d %d",&x,&y,&w);
x++,y++;//防止减1的时候出现负数
maxx=max(maxx,y);
minx=min(minx,x);
if(f(x-,y))//预防重边
G[x-].push_back(node(y,w));
}
for(int i=minx;i<=maxx;i++)
{
if(f(i-,i))//预防重边
G[i-].push_back(node(i,));
if(f(i,i-))//预防重边
G[i].push_back(node(i-,-));
}
spfa(minx-);
printf("%d\n",dis[maxx]);
}
return ;
}
/*
题目意思:
从一系列区间[a,b]中每个至少取ci个数构成集合s,问你集合s至少需要多少个数
区间约束问题,差分约束解决 分析:
f(x):[0,x]区间内取f(x)个数 则区间[a,b]内至少取c个数可以变形为:f(b)-f(a-1)>=c
隐藏关系:1>=f(i)-f(i-1)>=0,变形一下:
f(i)-f(i-1)>=0
f(i-1)-f(i)>=-1
maxx:所有区间的最大值
minx:所有区间的最小值 i属于[minx,maxx] 总结一下得到这样三个关系:
f(b)-f(a-1)>=c
f(i)-f(i-1)>=0 i属于[minx,maxx]
f(i-1)-f(i)>=-1 i属于[minx,maxx] 这三个表达式的形式都是一样的,xi-xj>=c
按照j->i建边,权值为c
所以:
(a-1)->b 建边 权值c
(i-1)->i 建边 权值0
i->(i-1) 建边 权值-1 我们要求的东西ans可以变形为:f(maxx)-f(minx-1)>=ans
>=是最小值,所以是最长路
所以是问你从minx-1到maxx的最长路
建图完毕之后spfa跑一遍最长路,不能用dj,因为存在负权边 */

POJ 1384 Intervals (区间差分约束,根据不等式建图,然后跑spfa)的更多相关文章

  1. POJ 1201 Intervals(差分约束 区间约束模版)

    关于差分约束详情可阅读:http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html 题意: 给定n个区间[L,R], 每个区间至 ...

  2. poj 1201 Intervals(差分约束)

    做的第一道差分约束的题目,思考了一天,终于把差分约束弄懂了O(∩_∩)O哈哈~ 题意(略坑):三元组{ai,bi,ci},表示区间[ai,bi]上至少要有ci个数字相同,其实就是说,在区间[0,500 ...

  3. POJ 1201 Intervals (经典) (差分约束)

    <题目链接> 题目大意:给你$n$段区间,$a_i,b_i,c_i$ 表示在 $[a_i,b_i]$ 区间内至少要选择$c_i$个点.现在问你在满足这n个条件的情况下,最少要选多少个点? ...

  4. HDU 1384 Intervals【差分约束-SPFA】

    类型:给出一些形如a−b<=k的不等式(或a−b>=k或a−b<k或a−b>k等),问是否有解[是否有负环]或求差的极值[最短/长路径].例子:b−a<=k1,c−b&l ...

  5. hdu 1384 Intervals (差分约束)

    Problem - 1384 好歹用了一天,也算是看懂了差分约束的原理,做出第一条查分约束了. 题意是告诉你一些区间中最少有多少元素,最少需要多少个元素才能满足所有要求. 构图的方法是,(a)-> ...

  6. POJ 1201 Intervals【差分约束】

    传送门:http://poj.org/problem?id=1201 题意: 有n个如下形式的条件:,表示在区间[, ]内至少要选择个整数点.问你满足以上所有条件,最少需要选多少个点? 思路:第一道差 ...

  7. 【题解】 POJ 1201 Intervals(差分约束)

    懒得复制,戳我戳我 Solution: 这道题就是一个板子题 抽象成第\(a\)至第\(b\)间选择数的个数为\(c\),我们就可以用前缀和来表示,这样就可以得到不等式\(s[b]-s[a-1]> ...

  8. POJ 1201 Intervals (差分约束,最短路)

    题意: 有一个集合Z,其元素都是整整数,但是数量未知.现有n个约束,形如 [a,b]=c 表示整数区间[a,b]中有c个元素在Z中出现.问集合Z最小可能含多少个元素? 思路: 对于所给的区间 cnt[ ...

  9. poj 1201 Intervals【差分约束+spfa】

    设s为前缀和,首先显然的条件是\[ s_{bi}-s_{ai-1}>=c \],然后隐含的是\[ s_i-s_{i-1}>=0 s_i-s_{i-1}<=1 \] 然后根据差分约束, ...

  10. HDU 1384 Intervals(差分约束)

    Intervals Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

随机推荐

  1. swoole框架快速入门

    swoole有两个部分. 一个是PHP扩展,用C开发的,这是核心. 另一个是框架,像yii.TP.Laravel一样,是PHP代码写的. swoole扩展本身提供了web服务器功能,可以替代php-f ...

  2. ARP原理和欺骗

    ARP--在TCP/IP协议栈中,最不安全的协议莫过于ARP了,我们经常听到的网络扫描,内网***,流量欺骗等等,他们基本上都与ARP有关系,甚至可以说,他们的底层都是基于ARP实现的.但是ARP的是 ...

  3. android中利用HttpURLConnection进行Get、Post和Session读取页面。

    直接上代码,调用的时候要放在线程中. package slj.getsms; import java.io.BufferedReader; import java.io.InputStreamRead ...

  4. BZOJ P1059 [ZJOI2007]矩阵游戏——solution

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4604  Solved: 2211[Submit][Stat ...

  5. 为什么推荐用ui-router替代ngRoute

    初学angularjs,第一个实例是官网的phoneCat,里面路由用的是ngRoute,后来看到别的用ui-router,觉得好奇,ui-route是什么呢?百度一些,得到如下解释: ui-rout ...

  6. 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)

    问题描述: 有时候使用 apt-get 终端提示这样的错误信息: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/ ...

  7. jquery 之节点操作

    一.添加节点 [添加内部子节点方法]:内部节点就是儿子节点 append()    在被选元素内部的结尾插入内容 appendTo()  将指定内容插入到被选标签内部的结尾 prepend()   在 ...

  8. 《ArcGIS Runtime SDK for Android开发笔记》——(4)、基于Android Studio构建ArcGIS Android开发环境

    1.前言 2015年1月15日,发布ArcGIS Runtime SDK for Android v10.2.5版本.从该版本开始默认支持android studio开发环境,示例代码的默认开发环境也 ...

  9. 【眼见为实】自己动手实践理解数据库REPEATABLE READ && Next-Key Lock

    [REPEATABLE READ] 首先设置数据库隔离级别为可重复读(REPEATABLE READ): set global transaction isolation level REPEATAB ...

  10. 使用@Value进行静态常量的值注入

    @Component public class ExpressConstant { public static String URL; @Value("${express.url}" ...