CF39C-Moon Craters【dp】
正题
题目链接:https://www.luogu.com.cn/problem/CF39C
题目大意
坐标轴上有\(n\)个圆,给出每个圆的位置\(c_i\)和半径\(r_i\)。
要求选出最多的圆使得他们不相交,求方案。
\(1\leq n\leq 2000\)
解题思路
转换为选出最多的不交区间,然后离散一下,按照区间长度排序。
设\(f_{i,j}\)表示区间\(i\)内最右边的圆边界是\(r\)时的最多数量。
然后转移就可以了。
时间复杂度\(O(n^2)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=2100,inf=2147483647;
int n,l[N],r[N],f[N][N<<1],fr[N][N<<1];
int cnt,p[N],b[N<<1];
vector<int> q[N<<1];
bool cmp(int x,int y)
{return (long long)r[x]-l[x]<=(long long)r[y]-l[y];}
void print(int x,int r){
if(r<l[x])return;
if(fr[x][r]){
printf("%d ",fr[x][r]);
print(fr[x][r],r);
print(x,l[fr[x][r]]);
}
else print(x,r-1);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
int c,R;
scanf("%d%d",&c,&R);
l[i]=c-R;r[i]=c+R;p[i]=i;
b[++cnt]=c-R;b[++cnt]=c+R;
}
l[++n]=-inf;r[n]=inf;p[n]=n;
b[++cnt]=-inf;b[++cnt]=inf;
sort(b+1,b+1+cnt);
cnt=unique(b+1,b+1+cnt)-b-1;
sort(p+1,p+1+n,cmp);
for(int xx=1;xx<=n;xx++){
int x=p[xx];
l[x]=lower_bound(b+1,b+1+cnt,l[x])-b;
r[x]=lower_bound(b+1,b+1+cnt,r[x])-b;
f[x][l[x]]=1;
for(int i=l[x]+1;i<=r[x];i++){
f[x][i]=f[x][i-1];
for(int j=0;j<q[i].size();j++){
int y=q[i][j];
if(l[y]<l[x])continue;
if(f[x][l[y]]+f[y][r[y]]>f[x][i])
f[x][i]=f[x][l[y]]+f[y][r[y]],fr[x][i]=y;
}
}
q[r[x]].push_back(x);
}
printf("%d\n",f[n][r[n]]-1);
print(n,r[n]);
return 0;
}
CF39C-Moon Craters【dp】的更多相关文章
- Kattis - honey【DP】
Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...
- HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】
HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HDOJ 1257 最少拦截系统 【DP】
HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDOJ 1159 Common Subsequence【DP】
HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- HDOJ_1087_Super Jumping! Jumping! Jumping! 【DP】
HDOJ_1087_Super Jumping! Jumping! Jumping! [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- POJ_2533 Longest Ordered Subsequence【DP】【最长上升子序列】
POJ_2533 Longest Ordered Subsequence[DP][最长递增子序列] Longest Ordered Subsequence Time Limit: 2000MS Mem ...
- HackerRank - common-child【DP】
HackerRank - common-child[DP] 题意 给出两串长度相等的字符串,找出他们的最长公共子序列e 思路 字符串版的LCS AC代码 #include <iostream&g ...
- LeetCode:零钱兑换【322】【DP】
LeetCode:零钱兑换[322][DP] 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成 ...
随机推荐
- 堆排序——Java实现
一.堆排序 堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点. 二.堆 什 ...
- 使用SuperSocket实现自定义协议C/S设计
一.简介: 21世纪是出于互联网+的时代,许多传统行业和硬件挂钩的产业也逐步转向了系统集成智能化,简单来说就是需要软硬件的结合.这时,软硬件通讯便是这里面最主要的技术点,我们需要做到的是让硬件能够听懂 ...
- WPF设计自定义控件
在实际工作中,WPF提供的控件并不能完全满足不同的设计需求.这时,需要我们设计自定义控件. 这里LZ总结一些自己的思路,特性如下: Coupling UITemplate Behaviour Func ...
- onJava8学习--java集合
翻翻博客,写了挺多,也学习过这些知识,翻翻脑子,没找到,再来一遍,整理好方便查阅复习. 本次学习内容来自On Java8java编程思想第五版 集合 泛型和类型安全的集合 基本概念 添加 ...
- java输入字符
1.创建一个Scanner对象. 2.调用.next()返回一个String类型用一个变量接受. 3.调用该String变量的.charAt(0),获取第一个字符. Scanner scn=new S ...
- PsSetCreateProcessNotifyRoutineEx 创建回调函数
转载自http://blog.csdn.net/yushiqiang1688/article/details/5209597 最近要做一个进程监控的程序,功能很简单,就是创建和退出进程的时候,能触发我 ...
- ArcGIS地形分析--TIN及DEM的生成,TIN的显示
DEM是对地形地貌的一种离散的数字表达,是对地面特性进行空间描述的一种数字方法.途径,它的应用可遍及整个地学领域.通过对本次实习的学习,我们应加深对TIN建立过程的原理.方法的认识:熟练掌握ArcGI ...
- JavaWeb之文件上传、下载
时间:2016-12-17 18:07 --文件上传概述上传不能使用BaseServlet1.文件上传的作用 例如网络硬盘,就是用来上传和下载文件的.2.文件上传对表单的限制 1)必须使用 ...
- 用vue的抽象组件来做一个防止img标签url为空或url地址出错的验证
看了网上文章学习了下vue的抽象组件,感觉就跟react的高阶组件一样的使用场景,只是更加面向vue的底层编程 ,网上介绍的抽象组件一般有2种用法,1 用来加防抖和节流 2 用来控制按钮是否允许点击做 ...
- a、b、n为正整数且a>b,证明:若n|(a^n-b^n),则n|(a^n-b^n)/(a-b).