区间 (vijos 1439) 题解

【问题描述】

现给定n个闭区间[ai,bi],1<=i<=n。这些区间的并可以表示为一些不相交的闭区间的并。你的任务就是在这些表示方式中找出包含最少区间的方案。你的输出应该按照区间的升序排列。这里如果说两个区间[a, b]和[c, d]是按照升序排列的,那么我们有a<b<=c<=d。

【样例输入】

5

5 6

1 4

10 10

6 9

8 10

【样例输出】

1  4

5 10

【解题思路】

本题为SDOI 2005 day2 第一题,是区间覆盖问题的变种,其实,看了问题描述后可能不太懂题目的意思,但是看完样例后就会发现,其实就是将一些连在一起的区间合并在一起,最后从小到大输出每个合并后的区间。既然要从小到大,那第一步自然是将每个区间以起点为关键字从小到大排序,然后从第二个区间开始,每个区间与前一个选的区间进行比较,若连在一起,则合并区间,否则,新开一个区间,将这个区间存入新开的区间。注意:除了判断是否连在一起,还要判断终点的大小,如果终点大一些才存,否则无视该区间。

【代码实现】

 1 type rec=record
 2      a,b:longint;
 3 end;
 4 var c,d:array[1..50000] of rec;
 5     i,j,n,m,ans,r,w:longint;
 6 procedure sort(l,r:longint);
 7 var
 8  i,j,x:longint;
 9  y:rec;
10 begin
11  i:=l;
12  j:=r;
13  x:=c[(l+r) div 2].a;
14  repeat
15   while c[i].a<x do
16    inc(i);
17   while x<c[j].a do
18    dec(j);
19   if not(i>j) then
20    begin
21     y:=c[i];
22     c[i]:=c[j];
23     c[j]:=y;
24     inc(i);
25     j:=j-1;
26    end;
27  until i>j;
28  if l<j then
29   sort(l,j);
30  if i<r then
31   sort(i,r);
32 end;
33 begin
34  readln(n);
35  for i:=1 to n do
36   with c[i] do
37    readln(a,b);
38  sort(1,n);
39  w:=1;d[1].a:=c[1].a;d[1].b:=c[1].b;
40  for i:=2 to n do
41   if (c[i].a<=d[w].b)and(c[i].b>=d[w].b) then//判断区间是否重合,若重合,更新终点
42    d[w].b:=c[i].b
43   else
44    if c[i].a>d[w].b then//若不重合,新开一个区间
45     begin
46      inc(w);
47      d[w].a:=c[i].a;
48      d[w].b:=c[i].b;
49     end;
50  for i:=1 to w do
51   with d[i] do
52    writeln(a,‘ ‘,b);
53 end.
时间: 2024-11-09 05:09:09

区间 (vijos 1439) 题解的相关文章

洛谷 P1865 A % B Problem(简单区间素数) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1865 题目背景 题目名称是吸引你点进来的 实际上该题还是很水的 题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m 接下来n行,每行两个整数 l,r 表示区间 输出格式: 对于每次询问输出个数 t,如l或r∉[1,m]输出 Crossing the line 输入输出样例 输入样例#1: 2 5 1 3

POJ 2018 Best Cow Fences(二分最大区间平均数)题解

题意:给出长度>=f的最大连续区间平均数 思路:二分这个平均数,然后O(n)判断是否可行,再调整l,r.判断方法是,先求出每个数对这个平均数的贡献,再求出长度>=f的最大贡献的区间,如果这个最大贡献大于0说明这个二分出来的数可行. 代码: #include<set> #include<map> #include<stack> #include<cmath> #include<queue> #include<vector>

POJ 1191 棋盘分割(区间DP)题解

题意:中文题面 思路:不知道直接暴力枚举所有情况行不行... 我们可以把答案转化为 所以答案就是求xi2的最小值,那么我们可以直接用区间DP来写.设dp[x1][y1][x2][y2][k]为x1 y1 到 x2 y2 区间分割为k份的最下平方和,显然k = 1是就是区间和的平方. 写了6层for,写出来自己都不信... 交C++才过... 代码: #include<cmath> #include<stack> #include<cstdio> #include<

HDU 4348 To the moon(主席树 区间更新)题解

题意: 给一个数组A[1] ~ A[n],有4种操作: Q l r询问l r区间和 C l r v给l r区间每个数加v H l r t询问第t步操作的时候l r区间和 B t返回到第t步操作 思路: 用主席树维护常规的线段树.我们之前已经知道了主席树单点更新,只要新增一条链就ok了,区间更新也有点差不多.我们每次要更新都用一个lazy标记,但是显然我们不能去更新那些已经存在的区间,那么我们就新建出所有要更新的区间.因为可持久化线段树有些结点不是自己的,所以我们不能直接简单的push up和pu

codedecision P1112 区间连续段 题解 线段树

题目描述:https://www.cnblogs.com/problems/p/P1112.html 题目链接:http://codedecision.com/problem/1112 线段树区间操作,每一个线段对应的点包含三个信息: \(l\):表示这个区间最左边的点的数值: \(r\):表示这个区间最右边的点的数值: \(cnt\):表示这个区间有多少个数值段. 合并的时候: 根节点的 \(l\) 值等于左儿子节点的 \(l\) 值: 根节点的 \(r\) 值等于右儿子节点的 \(r\) 值

POJ 2955 Brackets(区间DP)题解

题意:问最多有几个括号匹配 思路:用dp[i][j]表示i到j最多匹配,若i和j构成匹配,那么dp[i][j] = dp[i + 1][j - 1] + 2,剩下情况dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j]) 代码: #include<set> #include<map> #include<cmath> #include<queue> #include<cstdio> #include<

【BZOJ】3971 [WF2013]Матрёшка

[算法]区间DP [题解] 参考写法:BZOJ 3971 Матрёшка 解题报告 第二个DP可以预处理mex优化到O(nM+n2),不过我懒-- 第一个DP有另一种写法:不预处理,在一个n2取出来的的区间中,枚举决策点从左到右时,保留左最小值的可保留数不严格单调递增,保留右最小值的可保留数不严格单调递减,均摊O(1). ???[细节] f[0]=0初始化 inf+inf+inf就会爆int 区间第二重循环是i=1...n-p,否则有可能爆数组边界. #include<cstdio> #in

HDU 4348 To the moon 可持久化线段树

To the moon Problem Description BackgroundTo The Moon is a independent game released in November 2011, it is a role-playing adventure game powered by RPG Maker.The premise of To The Moon is based around a technology that allows us to permanently reco

CSU 1553 Good subsequence(RMQ问题 + 二分)

题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1553 Description Give you a sequence of n numbers, and a number k you should find the max length of Good subsequence. Good subsequence is a continuous subsequence of the given sequence and its m