dp只会看规律 SRM 10

描述

平面上有n个点(xi,yi),用最少个数的底边在x轴上且面积为S的矩形覆盖这些点(在边界上也算覆盖)

输入格式

第一行两个整数n,S
接下来n行每行两个整数xi,yi,表示点的坐标

输出格式

一行,一个整数,表示答案

样例输入

  1. 6 4
  2. 5 1
  3. 4 1
  4. 7 1
  5. 6 4
  6. 5 4
  7. 2 1

样例输出

  1. 3

数据范围与约定

n=3,1组数据
n=5,1组数据
n=11,1组数据 
n=15,1组数据 
n=18,1组数据
18<n<=100,7组数据 
对于所有的数据,
1<=n<=100
0<=xi<=3000000
1<=yi<=S
1<=S<=200000

样例解释

这里给出一种方案,每行为一个矩形:
1<=x<=3,0<=y<=2
3<=x<=7,0<=y<=1
5<=x<=6,0<=y<=4

————————————————————————————

这道题状压dp有四十分QAQ orzzsn

正解是一波dp

通过画图可知 两个矩形之间的关系 除了互不相交就是互相包含

并且互相包含的情况 中间的高度必须大于x长度比他大的

这样我们就可以枚举左右区间以及高度(高度从大到小)

当然我们要先给 x y 离散化降低一波复杂度 这个时候的复杂度才能做到n^4

当然如果一个 l r 的组合中他的左右边界上不存在点 我们可以强行挪到点上 这可以作为一波剪枝

dp的时候注意h比较小的区间 l r 要包含或者等于h比他大的区间 这样才能保证正确性

这样我们可以每一层类似递归的处理下去 判断一下两种情况 就可以做辣

f【l】【r】【h】表示左右端点为 l r 高度为 h 的区间覆盖所有点的最小答案

xd表示当前 l r 的区间长度 hh是区间的最大高度

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int M=,inf=0x3f3f3f3f;
  6. int read(){
  7. int ans=,f=,c=getchar();
  8. while(c<''||c>''){if(c=='-') f=-; c=getchar();}
  9. while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
  10. return ans*f;
  11. }
  12. struct node{int x,y;}e[M];
  13. bool cmp(node a,node b){return a.x<b.x;}
  14. int yy[M],xl[M],xr[M],n,m,S,f[M][M][M];
  15. void maxs(int& x,int y){if(x<y) x=y;}
  16. void mins(int& x,int y){if(x>y) x=y;}
  17. int main()
  18. {
  19. n=read(); S=read();
  20. for(int i=;i<n;i++) e[i].x=read(),e[i].y=read(),yy[i]=e[i].y;
  21. sort(e,e+n,cmp);
  22. sort(yy,yy+n);
  23. m=unique(yy,yy+n)-yy;
  24. for(int i=;i<n;i++) e[i].y=lower_bound(yy,yy+m,e[i].y)-yy;
  25. for(int r=;r<n;r++)
  26. for(int l=r;l>=;l--){
  27. int xd=e[r].x-e[l].x;
  28. int hh=xd?upper_bound(yy,yy+m,S/xd)-yy:m;
  29. for(int h=;h<m;h++) xl[h]=inf,xr[h]=-inf;
  30. for(int k=l;k<=r;k++) mins(xl[e[k].y],k),maxs(xr[e[k].y],k);
  31. for(int k=m-;k>=;k--) mins(xl[k],xl[k+]),maxs(xr[k],xr[k+]);
  32. for(int h=m-;h>=;h--){
  33. if(xl[h]==l&&xr[h]==r){
  34. int& F=f[l][r][h];
  35. F=inf;
  36. if(h<hh) mins(F,f[l][r][hh]+);
  37. for(int k=l;k<r;k++) mins(F,f[l][k][h]+f[k+][r][h]);
  38. }else if(xl[h]<=xr[h]) f[l][r][h]=f[xl[h]][xr[h]][h];
  39. }
  40. }
  41. printf("%d\n",f[][n-][]);
  42. return ;
  43. }

汕头市队赛 SRM10 dp只会看规律 && bzoj1766的更多相关文章

  1. 汕头市队赛 SRM10 T1模拟只会猜题意

    模拟只会猜题意 SRM 10 描述 有一本n个单词的词典,求按下列方法能造出的不相同的词汇数目.  1.词典中的单词是一个词. 2.能分为两部分的,其中前一部分是一个词典词或者其非空前缀,后一部分是一 ...

  2. 汕头市队赛 SRM10 T3 数学上来先打表

    数学上来先打表 SRM 10 描述 给出 n个点(不同点之间有区别),求出满足下列条件的连边(双向边)方案:1.每条边连接两个不同的点,每两个点之间至多有一条边2.不存在三个点a,b,c使三个点间两两 ...

  3. 汕头市队赛 SRM10 T1 贪心只能过样例

    贪心只能过样例 SRM 10 描述 给出n个数a[i](1<=a[i]<=n),问最多能把这些数分成几组,使得每个数a[i]所在的组至少有a[i]个数 输入格式 第一行一个整数n,接下来n ...

  4. 【STSRM10】dp只会看规律

    [算法]区间DP [题意]平面上有n个点(xi,yi),用最少个数的底边在x轴上且面积为S的矩形覆盖这些点(在边界上也算覆盖),n<=100. [题解]随机大数据下,贪心几乎没有错误,贪心出奇迹 ...

  5. 汕头市队赛 C KMP codeforces B. Image Preview

    汕头市队赛题目传送门 codeforces题目传送门 这道题我的做法是 尝试先往左走然后往右走 或者先往右走然后往左走 然后注意一下枚举顺序就okay啦 #include<cstdio> ...

  6. 汕头市队赛 SRM16 T2

    描述 猫和老鼠,看过吧?猫来了,老鼠要躲进洞里.在一条数轴上,一共有n个洞,位置分别在xi,能容纳vi只老鼠.一共有m只老鼠位置分别在Xi,要躲进洞里,问所有老鼠跑进洞里的距离总和最小是多少. 输入格 ...

  7. {CodeForces】788E New task && 汕头市队赛SRM06 D 五色战队

    D 五色战队 SRM 06 背景&&描述         游行寺家里人们的发色多种多样,有基佬紫.原谅绿.少女粉.高级黑.相簿白等.         日向彼方:吾令人观其气,气成五彩, ...

  8. 汕头市队赛 C SRM 05 - YYL 杯 R1 T3!

    C SRM 05 - YYL 杯 R1 背景 tjmak 描述 给一个大小为n的序列V.序列里的元素有正有负.问至少要删除多少个元素使得序列里不存在区间(要求非空)和 >= S.如果答案大于m, ...

  9. 汕头市队赛 SRM 06 A 撕书

    A 撕书 SRM 06 背景&&描述 游行寺汀正在杀书.         书总共有n页,每页都可以看作是一个小写英文字母,所以我们可以把书看成长度为n的字符串s.         琉璃 ...

随机推荐

  1. 【C++学习笔记】强大的算法——spfa

    spfa的定义 PFA算法的全称是:Shortest Path Faster Algorithm,用于求单源最短路,由西南交通大学段凡丁于1994年发表.当给定的图存在负边时,Dijkstra算法就无 ...

  2. Microsoft .Net framework 4.0出现 安装不成功,错误代码0x80240037 的解决方法

    ,安装Microsoft .Net framework 时出现 解决方法:用QQ管家 之后 以上就解决了

  3. MySql学习笔记05

    复习 GROUP BY 语句 HAVING 子句 -- 查询每个分类商品所对应的库存总量中,高于1000的总量 select category_id,sum(num) s from t_item gr ...

  4. LNMP源码安装脚本

    LNMP安装脚本,脚本环境   #LNMP环境搭建centos6.8 2.6.32-696.28.1.el6.x86_64  nginx:1.12.2   mysql:5.6.36  PHP:5.5. ...

  5. 多种方式实现依赖注入及使用注解定义bean

    构造注入 如何给构造方法中的参数注入方法呢如下 首先bean代码如下 package cn.pojo; public class Greeting { /** * 说的话 */ private Str ...

  6. 懒人的mysql管理脚本

    最近常用到的命令,太懒不想打太多 1,mysql启动,重启,停止脚本 echo '/usr/local/mysql5/support-files/mysql.server $1'>>/us ...

  7. linux 命令学习(持续完善中...)

    linux 命令学习(持续完善中...) 主要是记录一些开发过程中用到的linux命令,慢慢补充 一.用户 1.添加用户: useradd 用户名 2.设置密码:passwd 用户名 ,然后按照提示输 ...

  8. memset和memcpy

    void memset(void s, int ch, size_t n); 函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 ...

  9. P3387 【模板】缩点

    题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只 ...

  10. 13,scrapy框架的日志等级和请求传参

    今日概要 日志等级 请求传参 如何提高scrapy的爬取效率 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy ...