uva 1322 Minimizing Maximizer
题意:
有n个数,m个排序器,每个排序器可以把区间ai到bi的数从小到大排序。这m个排序器的输出就是m个排序之后的第n个数。
现在发现有些排序器是多余的。问至少需要多少个排序器可以使得输出不变。排序器的顺序不可以改变。
思路:
这题并没有说这些排序器可以覆盖1到n的所有区间。。。
假设可以,那么就是求最少的区间可以覆盖1到n。
用dp[i]表示覆盖第i个数需要的最少区间数,dp[i] = min(dp[i],dp[s] + 1) ai <= s <= b[i]。
如果单纯的枚举ai到bi,那么时间复杂度为n*m,肯定会t。
找一个区间的最小值,可以想到线段树,所以就用线段树来优化dp,单点查询,单点更新。
注意dp[1] = 0,并且也要在线段树中进行更新。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 5e4 + ;
const int inf = 0x3f3f3f3f;
int a[N<<];
int modi[N<<];
int dp[N];
void pushup(int rt)
{
a[rt] = min(a[rt<<],a[rt<<|]);
}
void build(int rt,int l,int r)
{
if (l == r)
{
a[rt] = inf;
return;
}
int mid = (l + r) >> ;
build(rt << ,l,mid);
build(rt << |,mid + ,r);
pushup(rt);
}
int query(int rt,int l,int r,int L,int R)
{
if (l >= L && r <= R)
{
return a[rt];
}
int mid = (l + r) >> ;
int r1 = inf,r2 = inf;
if (L <= mid) r1 = query(rt << ,l,mid,L,R);
if (R > mid) r2 = query(rt << |,mid + ,r,L,R);
return min(r1,r2);
}
void update(int rt,int l,int r,int p,int v)
{
if (l == r)
{
a[rt] = v;
return;
}
int mid = (l + r) >> ;
if (p <= mid) update(rt << ,l,mid,p,v);
else update(rt << |,mid + ,r,p,v);
pushup(rt);
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
int n,m;
memset(dp,inf,sizeof(dp));
memset(modi,-,sizeof(modi));
scanf("%d%d",&n,&m);
build(,,n);
dp[] = ;
update(,,n,,dp[]);
for (int i = ;i < m;i++)
{
int l,r;
scanf("%d%d",&l,&r);
int k = query(,,n,l,r);
dp[r] = min(dp[r],k+);
update(,,n,r,dp[r]);
}
printf("%d\n",dp[n]);
if (t) puts("");
}
return ;
}
/*
1
40 6
20 30
1 10
10 20
20 30
15 25
30 40
*/
uva 1322 Minimizing Maximizer的更多相关文章
- Minimizing maximizer(POJ 1769)
原题如下: Minimizing maximizer Time Limit: 5000MS Memory Limit: 30000K Total Submissions: 5104 Accep ...
- POJ1769 Minimizing maximizer(DP + 线段树)
题目大概就是要,给一个由若干区间[Si,Ti]组成的序列,求最小长度的子序列,使这个子序列覆盖1到n这n个点. dp[i]表示从第0个到第i个区间且使用第i个区间,覆盖1到Ti所需的最少长度 对于Si ...
- poj 1769 Minimizing maximizer 线段树维护dp
题目链接 给出m个区间, 按区间给出的顺序, 求出覆盖$ [1, n] $ 至少需要多少个区间. 如果先给出[10, 20], 在给出[1, 10], 那么相当于[10, 20]这一段没有被覆盖. 令 ...
- POJ.1769.Minimizing maximizer(线段树 DP)
题目链接 /* 题意:有m个区间,问最少要多少个区间能覆盖[1,n] 注:区间要按原区间的顺序,不能用排序贪心做 设dp[i]表示最右端端点为i时的最小值 dp[e[i]]=min{dp[s[i]]~ ...
- UVA-1322 Minimizing Maximizer (DP+线段树优化)
题目大意:给一个长度为n的区间,m条线段序列,找出这个序列的一个最短子序列,使得区间完全被覆盖. 题目分析:这道题不难想,定义状态dp(i)表示用前 i 条线段覆盖区间1~第 i 线段的右端点需要的最 ...
- poj1769 Minimizing maximizer
传送门 题目大意 给你m个机器,n个数,每个机器可以给n个数的某一段排序,求最少使用几个机器,保证可以把这个n个数排好序 分析 我们可以想到dpij表示考虑前i个机器让最大的数到达点j至少需要使用多少 ...
- POJ 1769 Minimizing maximizer(DP+zkw线段树)
[题目链接] http://poj.org/problem?id=1769 [题目大意] 给出一些排序器,能够将区间li到ri进行排序,排序器按一定顺序摆放 问在排序器顺序不变的情况下,一定能够将最大 ...
- POJ 1769 Minimizing maximizer (线段树优化dp)
dp[i = 前i中sorter][j = 将min移动到j位置] = 最短的sorter序列. 对于sorteri只会更新它右边端点r的位置,因此可以把数组改成一维的,dp[r] = min(dp[ ...
- Minimizing Maximizer
题意: 最少需要多少个区间能完全覆盖整个区间[1,n] 分析: dp[i]表示覆盖[1,i]最少需要的区间数,对于区间[a,b],dp[b]=min(dp[a...b-1])+1;用线段树来维护区间最 ...
随机推荐
- python摸爬滚打之day12----生成器, 各种生成式
1.生成器 生成器的本质就是迭代器. 1.1 获取生成器 1: 生成器函数 函数中出现 "yield" 的函数就是一个生成器函数, 再次执行函数时就不是运行函数而是获取生成器. ...
- 手工sql注入简单入门
1.判断是否可以注入: 数字型: 1.1在参数后面加一个引号',如果页面报数字number错误,则一定不是sql注入点:如果报数据库比如mysql.oracle之类的错误,则是一个sql注入点. 1. ...
- (1.5)MySQL表的5种分区类型
(1.5)MySQL表的5种分区类型 关键词:mysql表分区 小细节: (1)Null 将会放入最小范围区间 (2)无论哪种类型的分区,要么没有主键.唯一键,要么分区表的主键/唯一键都必须包含 ...
- 根据数据库结构生成RzCheckTree
现在大多数的方法是采用递归,但这种操作会频繁的去select数据库,降低了执行效率,稍微改动一些,效果会好不少,这里介绍一种方法,即一次性select出所有数据,然后按照ParentID排序,逐条添加 ...
- oracle sql 游标的简单用法(tip:sql中两个单引号表示一个单引号)
--游标遍历某个字段 (打印出来) declare res_sql varchar2(2000); cursor cur is select f_dcnam ...
- select默认选择后台转过来的option选项
<select> <option value="#" >--请选择--</option> <option value="1&qu ...
- ANSI码和UNICODE码
什么是ANSI,什么又是UNICODE呢? 其实这是两种不同的编码方式标准,ANSI中的字符采用8bit,而UNICODE中的字符采用16bit. (对于字符来说ANSI以单字节存放英文字符,以双字节 ...
- extjs store快速创建的几种方式
viewModel中定义stores: { tickets: { model: 'Ticket', autoLoad: true, remoteFilter: true, filters: [{ pr ...
- SIP协议流程
1.注册流程: 2.注销流程: 3. 基本呼叫建立过程: 4. 会话更改流程: 5. 正常呼叫释放过程: 6. 被叫忙呼叫释放: 7.被叫无应答流程一: 8.被叫无应答流程二: 9.遇忙呼叫前转:
- mac xcode 常见配置
1.报错:There are no schemes in workspace "..." 设置scheme共享,方法: 2.Build 文件夹是中间文件的保存地方,如何设置在工程目 ...