P2434 [SDOI2005]区间

题目描述

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

请写一个程序:

读入这些区间;

计算满足给定条件的不相交闭区间;

把这些区间按照升序输出。

输入输出格式

输入格式:

第一行包含一个整数n,3<=n<=50000,为区间的数目。以下n行为对区间的描述,第i行为对第i个区间的描述,为两个整数1<=ai<bi<=1000000,表示一个区间[ai, bi]。

输出格式:

输出计算出来的不相交的区间。每一行都是对一个区间的描述,包括两个用空格分开的整数,为区间的上下界。你应该把区间按照升序排序。

输入输出样例

输入样例#1:

5
5 6
1 4
10 10
6 9
8 10
输出样例#1:

1 4
5 10

思路:先使用很基础的操作,也就是线段覆盖的方式,将每一条线段插入线段树。最后求区间的做法是这样子的:

设两个变量a,b。一开始都让他们等于1.开个while(b<=n);每次查询区间【a,b】是否被完全覆盖。是的话,b++;不是的话判断a是否等于b,如果等于。a++,b++;如果a不等于b那么输出a b;然后a=b。

最后跳出循环时也要判断a是否等于b,等于的话程序结束。不等于的话输出a b,其实也就是a n。程序结束

注意一个地方!

我们在进行修改的时候修改的是一段区间,但是我们线段树中的这段区间与我们所说的区间有一点不一样,例如样例中的1~4,5~6,我们如果用线段树进行修改的话我们修改出来的会是

1 1  1 1 1 1 也就是说我们将1~6整个区间都给修改了,但是我们所说的修改是要将其变成1 1 1 0 1 1 也就是说4这个点不进行修改。那么我们在修改的时候就讲尾节点-1以后再进行区间修改就好了。

代码:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 410000
using namespace std;
int n,m,x,y,xx[N],yy[N],ans,sum;
int read()
{
    ,f=; char ch=getchar();
    ; ch=getchar();}
    +ch-'; ch=getchar();}
    return x*f;
}
struct Tree
{
    int l,r,w,f;
 }tree[N];
void build(int k,int l,int r)
 {
     tree[k].l=l,tree[k].r=r;
     if(tree[k].l==tree[k].r)
     {
         tree[k].w=;
         return ;
     }
    ;
    build(k<<,l,m);
    build(k<<|,m+,r);
 }
int down(int k)
{
    tree[k<<].f=tree[k].f;
    tree[k<<|].f=tree[k].f;
    tree[k<<].w=tree[k<<].r-tree[k<<].l+;
    tree[k<<|].w=tree[k<<|].r-tree[k<<|].l+;
    tree[k].f=;
}
void change_interval(int k)
{
     if(tree[k].l>=x&&tree[k].r<=y)
     {
         tree[k].w=tree[k].r-tree[k].l+;
         tree[k].f=;
         return;
     }
     if(tree[k].f) down(k);
     ;
     );
     |);
     tree[k].w=tree[k<<].w+tree[k<<|].w;
}
void ask_interval(int k)
{
     if(tree[k].l>=x&&tree[k].r<=y)
     {
         ans+=tree[k].w;
         return;
     }
     if(tree[k].f) down(k);
     ;
     );
     |);
}
 int main()
 {
     n=read();
     ;i<=n;i++)
      xx[i]=read(),yy[i]=read(),m=max(m,max(xx[i],yy[i]));
    build(,,m);
    ;i<=n;i++)
     x=xx[i],y=yy[i]-,change_interval();
    x=,y=;
    while(y<=m)
    {
        ans=;ask_interval();
        ) y++;
        else
        {
            if(x==y) x++,y++;
            else
            {
                printf("%d %d\n",x,y);
                x=y;
            }
        }
    }
    if(x!=y) printf("%d %d",x,m);
     ;
 }

原来是打算用来练线段树的一道题,结果做了一下午,而且这道题暴力,贪心,前缀和都可以做!!!!

唉,发一个贪心的吧、、、按左端点排序后,记录当前区间[L,R],如果新的区间的l<=R,说明新的区间可以合并,更新R,如果新的区间l>R,说明新的区间不能跟当前区间合并,又因为已经按左端点拍了序,所以输出当前区间。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 410000
using namespace std;
int n,m,x,y,ans,sum;
int read()
{
    ,f=; char ch=getchar();
    ; ch=getchar();}
    +ch-'; ch=getchar();}
    return x*f;
}
struct A
{
    int l,r;
}a[N];
int cmp(A a,A b)
{
    return a.l<b.l;
}
int main()
{
    n=read();
    ;i<=n;i++)
     a[i].l=read(),a[i].r=read();
    sort(a+,a++n,cmp);
    ].l,r=a[].r;
    ;i<=n;i++)
    {
        if(a[i].l<=r) r=max(r,a[i].r);
        else
        {
            printf("%d %d\n",l,r);
            l=a[i].l;r=a[i].r;
        }
    }
    printf("%d %d",l,r);
    ;
}

洛谷——P2434 [SDOI2005]区间的更多相关文章

  1. 洛谷P2434 [SDOI2005]区间

    题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排列 ...

  2. 洛谷 2434 [SDOI2005]区间

    [题解] 鲜活的大水题... 把区间排个序然后瞎搞就可以了,发现现在区间的左端点比之前区间的最大的右端点还大,那就增加一个答案区间.每次更新目前最大右区间. #include<cstdio> ...

  3. 洛谷 1063 dp 区间dp

    洛谷 1063 dp 区间dp 感觉做完这道提高组T1的题之后,受到了深深的碾压,,最近各种不在状态.. 初看这道题,不难发现它具有区间可并性,即(i, j)的最大值可以由(i, k) 与 (k+1, ...

  4. BZOJ5259/洛谷P4747: [Cerc2017]区间

    BZOJ5259/洛谷P4747: [Cerc2017]区间 2019.8.5 [HZOI]NOIP模拟测试13 C.优美序列 思维好题,然而当成NOIP模拟题↑真的好吗... 洛谷和BZOJ都有,就 ...

  5. 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化

    洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...

  6. 【洛谷】P2434 [SDOI2005]区间(暴力)

    题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排列 ...

  7. 洛谷 P1890 gcd区间

    P1890 gcd区间 题目提供者 洛谷OnlineJudge 标签 数论(数学相关) 难度 普及/提高- 题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R] ...

  8. 洛谷P2879 [USACO07JAN]区间统计Tallest Cow

    To 洛谷.2879 区间统计 题目描述 FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. ...

  9. 题解 洛谷P2434 【[SDOI2005]区间】

    本题的贪心策略是以区间起点位置由小到大排序,然后开始合并. 区间按起点顺序由小到大排序,可以最大化合并成功的可能. 这个脑补应该不难想出来.(读者自证不难 直接上代码: #include <bi ...

随机推荐

  1. ICEcoder显示汉字出现乱码的处理

    在网上看到icecoder这个小东西,是一个基于web的编辑器,很不错.唯一的缺点是打开的文件中汉字会变成乱码. 经查看源代码,在lib/file-control.php中,第89行是: echo ' ...

  2. react基础语法(二)常用语法如:样式 ,自定义属性,常用表达式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. js图片轮播效果常见的产品无缝轮播

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  4. Ioc 之 Unity的依赖注入

    Unity是微软官方提供的一个Ioc容器,用来实现依赖注入,减少代码之间的耦合程度.使用Unity实现Ioc方式有两种,一种是使用代码方式实现,一种是利用配置文件来实现. 我们先来看一下代码方式是如何 ...

  5. 字符串类型:str, bytes 的区别

    Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分. 文本总是 Unicode,由 str 类型表示, 二进制数据则由 bytes 类型表示. Python 3不会以任意隐式的方 ...

  6. JavaEE-09 Ajax与jQuery在JavaEE项目中的使用

    学习要点 JavaScript实现Ajax jQuery实现Ajax JSON JSON-LIB FastJSON JavaScript实现Ajax 认识Ajax 旧版百度地图 百度搜索自动补全 百度 ...

  7. Maven实战读书笔记(六):Maven灵活构建

    Maven为了支持构建的灵活性,内置了3大特性,即:属性.Profile和资源过滤. 6.1 Maven属性 Maven的属性与Java代码的常量有异曲同工之妙,都是为了消除重复,对相关内容进行统一管 ...

  8. Word转html并移植到web项目

    1.打开对应word文件 建议使用web视图查看文档 这样可以提前预览转转成html样式 2.如果有图片修改图片大小及格式 在web视图下,把图片调制适当大小,不然导出的html可能图片较小 3.点击 ...

  9. h lib dll文件相关部分

    参考:https://www.cnblogs.com/azbane/p/7364060.html 只对其中自己用得到的重点做了个笔记. 1..h头文件是编译时必须的,lib是链接时需要的,dll是运行 ...

  10. Ubuntu中python链接本地数据库

    由于python链接数据库需要下载DB API模块:例如你需要访问Mysql数据,你需要MySQL数据库模块. DB-API是一个规范. 以便为不同的底层数据库系统和数据库接口程序提供一致的访问接口. ...