原文地址

首先本题题意是:有一面墙,被等分为1QW份,一份的宽度为一个单位宽度。现在往墙上贴N张海报,每张海报的宽度是任意

的,但是必定是单位宽度的整数倍,且<=1QW。后贴的海报若与先贴的海报有交集,后贴的海报必定会全部或局部覆盖先贴的海

报。现在给出每张海报所贴的位置(左端位置和右端位置),问张贴完N张海报后,还能看见多少张海报?

利用线段切割,由于后贴的海报可能会覆盖前面的,而很明显知道前面的海报不会影响后面海报的可见性,所以应该从后面往

前面推。

所以程序中就有:for(i=n-1;i>=0;i--)   

现在我们暂时只分析前一张海报与后一张海报的关系就可以了,然后递推就可以了。

我们用海报的长度来表示可见性,如果长度大于0,当然就可见啊

对于海报之间的关系,只有那么几种情况,但是看程序中只有3种关系,实际上在统计可见性时我们说只需要3种就够了,为什

么呢?

我们可以自己模拟一下:

如果两张海报没有交集,那么下面的那张海报一定是可见的,所以长度当然大于0,

如果两张海报有交集,就必然有4种关系,但是这里我们相当于只有两种就够了,就是后面的覆盖前面的右半部分,或者后面的

覆盖前面的左半部分,注意我们开始memset所有的海报长度是0,所以如果出现后面的海报全部覆盖前面的海报的情况就不用

管,因为它就是0,但是还有一种关系,就是后面的海报覆盖前面海报的中间部分,这样的话我们就可以把它当成覆盖左边部分

或者覆盖右边部分,因为我们的判断语句是

 if(l<node[k].x) 

 if(r>node[k].y)   

很明显可以看出实际上这两个语句包含了3种情况。而不仅仅代表只覆盖右部分或者左部分。

这样我们在结构体里面用ans统计每张海报最终的长度,实际上不一定是真正的长度哈,比如后一张只覆盖前一张的和中间部分

的那一种情况,实际上ans就只记录了前面的海报的左边部分,所以这样本题就解决了,线段切割实现起来更容易。

注意线段切割与矩形切割适用的范围:对边界范围大,操作数少的题目,我们选择矩形切割或者线段切割。 

#include <stdio.h>
#include <string.h> const int N = 10005; typedef struct
{
int x,y;
int ans;
}Node; Node node[N]; int n; void Cover(int l,int r,int k,int c)
{
while(k<n&&(r<node[k].x||l>node[k].y)) k++;
if(k>=n) //当前进行切割的线段并没有和后面的线段相交
{
node[c].ans+=r-l+1;
return;
}
if(l<node[k].x) Cover(l,node[k].x-1,k+1,c); //当前线段的右边被覆盖;
if(r>node[k].y) Cover(node[k].y+1,r,k+1,c); //当前线段的左边被覆盖;
} int main()
{
int t,i,sum;
scanf("%d",&t);
while(t--)
{
sum=0;
memset(node,0,sizeof(node));
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d%d",&node[i].x,&node[i].y);
for(i=n-1;i>=0;i--) //这里是用后面的海报覆盖前面的海报,所以要从后面开始进行插入(进行线段切割);
Cover(node[i].x,node[i].y,i+1,i);
for(i=0;i<n;i++)
if(node[i].ans>0)
sum++;
printf("%d\n",sum);
}
return 0;
}

POJ2528的另一种解法(线段切割)的更多相关文章

  1. [LeetCode] Remove Element (三种解法)

    Given an array and a value, remove all instances of that value in place and return the new length. T ...

  2. Poj 2528-Mayor's posters 线段切割

      题目:http://poj.org/problem?id=2528 Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total ...

  3. codewars.DNA题目几种解法分析(字符串替换)

    题干: 意思就是字符串替换,"A"与"C"配对,"T"与"G"配对,DNA不为空. 解法一:我的解法,用for循环遍历字 ...

  4. LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)

    这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...

  5. LeetCode算法题-Number Complement(Java实现-五种解法)

    这是悦乐书的第240次更新,第253篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第107题(顺位题号是476).给定正整数,输出其补码数.补充策略是翻转其二进制表示的位 ...

  6. LeetCode算法题-Third Maximum Number(Java实现-四种解法)

    这是悦乐书的第222次更新,第235篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第89题(顺位题号是414).给定非空的整数数组,返回此数组中的第三个最大数字.如果不存 ...

  7. LeetCode算法题-Longest Palindrome(五种解法)

    这是悦乐书的第220次更新,第232篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第87题(顺位题号是409).给定一个由小写或大写字母组成的字符串,找到可以用这些字母构 ...

  8. LeetCode算法题-Find the Difference(Java实现-五种解法)

    这是悦乐书的第214次更新,第227篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第82题(顺位题号是389).给定两个字符串s和t,它们只包含小写字母.字符串t由随机混 ...

  9. LeetCode算法题-Valid Perfect Square(Java实现-四种解法)

    这是悦乐书的第209次更新,第221篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第77题(顺位题号是367).给定正整数num,写一个函数,如果num是一个完美的正方形 ...

随机推荐

  1. CSS3 过渡、变形和动画

    一.我们来给按钮增加一个悬停效果:#content a:hover {border: 1px solid #000000;color: #000000;text-shadow: 0px 1px whi ...

  2. PHP实现多继承 - 通过接口的多继承特性(二)

    原文地址:http://small.aiweimeng.top/index.php/archives/51.html 在上篇文章中写到php可以使用```Trait```实现代码的复用,下面介绍使用接 ...

  3. 【原创】Dynamics CRM 2015/2016,以PDF的形式打开SSRS报表。

    基本步骤: 使用SSRS建立报表,以下的例子是以记录的GUID作为报表的参数 获取ReportSession 和 ControlId来调用报表 以PDF的形式预览报表 一.根据报表的名称获取报表的GU ...

  4. 大数据学习--day12(内部类)

    内部类学习     定义在类的内部的类  叫做内部类     包含了内部类的类 叫做外部类 内部类的作用      内部类是为了 实现 java中 多继承而存在的      内部类 可以继承其他类   ...

  5. ImageMagick命令执行学习笔记(常见于图片预览处)

    实验版本: ImageMagick版本:6.9.2 push graphic-context viewbox 0 0 640 480 fill 'url(https://"|whoami&q ...

  6. C语言下的错误处理问题

    今天来分享我认为比较好的几种在C语言下的错误处理方式 方式一: int example(int num) { ) { ; } ; } 在不符合条件的情况下使用return终止程序 方式二: void ...

  7. 【win7下安装node.js错误:roling back action】与【"grunt" 不是内部或外部命令】 解决方法

    [win7下安装node.js错误:roling back action] 解决方法: Node.js 服务器端的JavaScript Node.js 是一个基于Chrome JavaScript 运 ...

  8. 20155317 实验二 Java面向对象程序设计

    20155317 实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步 ...

  9. 20155338 2016-2017-2《Java程序设计》实验四Android程序开发实验报告

    2016-2017-2 20155338 <Java程序设计>实验四Android程序开发实验报告 实验过程及成果展示 1.修改res目录下的layout文件夹中的activity_mai ...

  10. 一步步带你配置IIS(包括错误分析)

    今天趁着工作中的问题一下子来解决IIS配置 发布网站:点击VS发布网站 第一步:新建配置文件(我取名为webSite) : 第二步:选择发布方法并且选择把文件发布到哪里(比喻在D盘创建一个文件夹web ...