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.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成 ...
随机推荐
- easyexcel-导入
package com.meeno.framework.util.easyexcel.entity; import cn.afterturn.easypoi.excel.annotation.Exce ...
- [转]C# 互操作性入门系列(三):平台调用中的数据封送处理
参考网址:https://www.cnblogs.com/FongLuo/p/4512738.html C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列( ...
- 堆排序——Java实现
一.堆排序 堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点. 二.堆 什 ...
- Java中的比较器(排序)
"顺序"在任何一个领域里都是非常重要的一个概念,程序也不例外.不同的执行顺序,能对你的执行结果产生直接影响. 既然涉及到顺序,那就要求排序.所以本文讨论的就是排序中使用到的比较器C ...
- rest operater剩余操作符
rest叫做剩余操作符(rest operator),是解构的一种,意思就是把剩余的东西放到一个array里面赋值给它.一般只针对array的解构 //rest叫做剩余操作符(rest operato ...
- MySQL锁(表锁,行锁,共享锁,排它锁,间隙锁)使用详解
锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是协调多个进程或县城并发访问某一资源的一种机制.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一 ...
- Git使用教程六
冲突的产生与解决 案例:模拟产生冲突. ①同事在下班之后修改了线上仓库的代码 注意:此时我本地仓库的内容与线上不一致的. 2.第二天上班的时候,我没有做git pull操作,而是直接修改了本地的对应文 ...
- 从kratos分析BBR限流源码实现
什么是自适应限流 自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load.CPU 使用率.总体平均 RT.入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流 ...
- QT学习日记篇01(1)-QT界面初探- *.pro文件详解
一: 项目管理文件(.pro文件) 项目管理文件用于记录项目的一些设置,以及项目包含文件的组织管理 后缀为".pro"的 文件是项目的管理文件,文件名就是项目的名称,如Demo.p ...
- (二)羽夏看C语言——容器
写在前面 由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...