题目:

Covering the Corral

  • Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others)
Description

The cows are so modest they want Farmer John to install covers around the circular corral where they occasionally gather. The corral has circumference C (1 ≤ C ≤ 1,000,000,000), and FJ can choose from a set of M (1 ≤ M ≤100,000) covers that have fixed starting points and sizes. At least one set of covers can surround the entire corral.

Cover i can be installed at integer location x_i (distance from starting point around corral) (0 ≤ x_i < C) and has integer length l_i (1 ≤ l_i ≤ C).

FJ wants to minimize the number of segments he must install. What is the minimum number of segments required to cover the entire circumference of the corral?

Consider a corral of circumference 5, shown below as a pair of connected line segments where both '0's are the same point on the corral (as are both 1's, 2's, and 3's).

Three potential covering segments are available for installation:

          Start     Length
   i       x_i       l_i
   1        0         1
   2        1         2
   3        3         3

Installing segments 2 and 3 cover an extent of (at least) five units around the circumference. FJ has no trouble with the overlap, so don't worry about that.

Input

* Line 1: Two space-separated integers: C and M

* Lines 2..M+1: Line i+1 contains two space-separated integers: x_i and l_i

Output

* Line 1: A single integer that is the minimum number of segments required to cover all segments of the circumference of the corral

Sample Input

5 3
0 1
1 2
3 3

Sample Output

2

题意:

给出一个10亿的环,再给出10W个固定区间,问最少选取多少个区间能够覆盖完整个环?

思路:

首先按区间起点排序,然后贪心找出选了每一个区间之后,下一个区间应该选谁

注意到当遇到某个区间的y不递增的时候,这个区间显然会被别的区间所完全覆盖,那么这个区间是一个无效区间,所以有效区间的y也是递增的,那么我们就可以使用单调队列了,

然后是倍增法,dp[i][j]表示选取第i个区间的时候接下来第2^j个区间要取谁

那么有状态转移:dp[i][j]=dp[dp[i][j-1]][j-1]

倍增大法好,但是貌似被我写搓了,看了下别人的代码,有效率是我1/4的_(:з」∠)_

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXN 100010
#define inf 0x3f3f3f3f
struct node
{long long x,z;int next;
}k[MAXN*2];
struct node2
{long long x,z;int i;
}dl[MAXN*2];
int n,m,up;
int mi[25];
int dp[MAXN*3][17];
int cmp(const void *a,const void *b)
{return (*(struct node *)a).x>(*(struct node *)b).x?1:-1;
}
void find_next()
{int i,j,l,s=0,t=-1,lastz=-1,sign=1;for(i=0;i<n;i++){if(k[i].z<=lastz)///特判无用区间{k[i].next=-1;continue;}for(l=s;l<=t;l++)if(k[i].x<dl[l].x)break;s=l;for(j=sign;k[j].x<=k[i].z+1&&j<n*2;j++){for(l=t;l>=s;l--)if(k[j].z<=dl[l].z)break;t=l+1;dl[t].z=k[j].z;dl[t].x=k[j].x;dl[t].i=j;}sign=j;if(t<s)k[i].next=-1;elsek[i].next=dl[s].i;lastz=k[i].z;}
}int pd(int x,long long sign)
{if(x==-1)return 1;if(k[x].x<sign&&k[x].z+1>=sign)return 0;if(k[x].x>=sign)return 1;elsereturn -1;
}
int find_ans(int t)
{///dp[i][j]代表第i个答案的下j^2个答案int i,j,res=1,tmp,top=up;long long sign=k[t+n].x;if(k[t].z+1>=sign)return 1;if(dp[t][0]==-1)return inf;while(1){for(j=0;j<=top;j++){tmp=pd(dp[t][j],sign);if(tmp==0)///当前答案恰好return res+mi[j];if(tmp==1)///当前答案太大break;}if(j==0||j==1)return inf;else{t=dp[t][j-1];res+=mi[j-1];top=j-2;}}
}
int main()
{int i,j,t,ans,tmp;mi[0]=1;for(i=1;i<=20;i++)mi[i]=mi[i-1]*2;while(scanf("%d%d",&m,&n)!=EOF){tmp=n;up=-1;do{tmp/=2;up++;}while(tmp);for(i=0;i<n;i++)scanf("%lld%lld",&k[i].x,&k[i].z);qsort(k,n,sizeof(k[0]),cmp);for(i=0;i<n;i++){k[i].z=k[i].x+k[i].z-1;k[i+n]=k[i];k[i+n].x+=m;k[i+n].z+=m;}find_next();memset(dp,-1,sizeof(dp));for(i=0;i<n;i++){dp[i][0]=k[i].next;if(dp[i][0]!=-1)dp[i+n][0]=k[i].next+n;}for(j=1;j<=up;j++)for(i=0;i<n;i++)if(dp[i][j-1]==-1)dp[i][j]=-1;elsedp[i][j]=dp[dp[i][j-1]][j-1];ans=inf;for(i=0;i<n;i++){if(dp[i][0]==-1)continue;t=find_ans(i);if(t<ans)ans=t;}printf("%d\n",ans);}return 0;
}

DELL Software contest 2014 H题 1007 Covering the Corral相关推荐

  1. [题解] 2019牛客暑期多校第三场H题 Magic Line

    题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意:二维平面上有n个不同的点,构造一条直线把平面分成两个点数相同的部分. 题解:对这n个点以x为第一关键 ...

  2. 2021年度训练联盟热身训练赛第五场 H题In-place Sorting+贪心构造

    题意: 给你n个小于101810^{18}1018的大数,问在可以再不改变序列位置,之改变数值中某数位的'9'变为'6'或将'6'变为'9',求的最终序列由小到大,且字典序最小. 题目: 链接:htt ...

  3. NEERC 2014 D题 Damage Assessment

    NEERC 2014 D题 Damage Assessment 题目描述 直接计算定积分 辛普森方法 Romberg方法 题目描述 这里是NEERC2014的相关资料,包括榜.题目.标程,但是好像没有 ...

  4. (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题)

    layout: post title: (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题) author: " ...

  5. 牛客-https://www.nowcoder.com/acm/contest/96/H

    链接:https://www.nowcoder.com/acm/contest/96/H 来源:牛客网 题目描述 今天qwb要参加一个数学考试,这套试卷一共有n道题,每道题qwb能获得的分数为ai,q ...

  6. 直线---科林明伦杯H题

    大数乘法---第一次碰到,记录一下 https://ac.nowcoder.com/acm/contest/5758/H #include<bits/stdc++.h> using nam ...

  7. 2019 年TI杯全国大学生电子设计竞赛H题模拟电磁曲射炮

    2019 年TI杯全国大学生电子设计竞赛H题模拟电磁曲射炮 前言 首先要肯定电子设计竞赛的含金量,而也正是电子设计竞赛给了我本科阶段最好的体验.此文章介绍的作品是我所在团队于2019年参加电赛的参赛作 ...

  8. 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛H题小Y与多米诺骨牌(线段树优化dp)

    题意 题目链接:https://www.nowcoder.com/acm/contest/91/H 来源:牛客网 题解 设l[i]l[i]l[i]为向左推第iii个骨牌最远能影响到的骨牌的编号,r[i ...

  9. 软件设计师2014上午题基础知识(易错整理)

    软件设计师2014上午题基础知识(易错整理) 2014 上半年 木马程序的客户端运行在攻击者的机器上 海明码检验位计算:有效信息位 + 校验位个数 <= 2^校验位个数 - 1 防火墙工作层次越 ...

最新文章

  1. appender log4j 扩展_java-如何在log4j2中创建自定义Appender?
  2. C#设计模式之:抽象工厂模式与反射
  3. 运维技术之一、supervisorctl 守护进程的安装和使用
  4. Sybase数据库中找回丢失的sa密码
  5. 程序员崩溃的40个瞬间!!!
  6. ajax 示例_通过示例了解挥发
  7. 面试常见问题之实现bind函数
  8. 消息订阅与发布(pubsub)
  9. 【1】Docker概述
  10. [转]BT种子文件格式
  11. 个税改革怎么改?媒体称年收入超12万者税负或增加
  12. 一文读懂电子材料行业最新发展趋势
  13. MAC OS系统如何使用动态远程桌面
  14. 面试阿里,看这一篇就够了!
  15. 1分钟教你快速使用C#查找和替换PDF文件中的文本
  16. 移动硬盘变成RAW,如何将其转换为NTFS
  17. html计算梯形的面积,梯形的面积计算
  18. Lesson 40 Food and talk 进餐与交谈
  19. React中Mpegts播放器的使用
  20. 一文读懂 Java 反射机制那些事

热门文章

  1. H5实现RTMP流的直播小记
  2. 二、计算机网络的标准化工作
  3. 怎样与你的懒蛋同事相处?
  4. visionman-康耐视智能相机Insight视觉课程大纲(0718更新,永久更新)
  5. 我的世界java版怎么加整合包_我的世界完美世界整合包
  6. day05 【异常、线程】
  7. 一个艰难的决定。。。搬家了~
  8. DEVONthink Pro/Server 3.6.3 中文版 文件管理用具
  9. oracle中 sql%rowcount 用法
  10. Android 分割线