Photo bzoj-3126

题目大意:给你一个n长度的数轴和m个区间,每个区间里有且仅有一个点,问最多能有多少个点。

注释:$1\le n \le 2\cdot 10^5$,$1\le m\le10^5$。

想法:开始和GXZlegend在那里贪心。贪了挺久发现几乎所有的贪心策略都会被卡,此题被当做毒瘤题。然后上bz上找题解发现了新大陆??

  这题是一个dp。

  状态:dp[i]表示第i个位置必须放点,最多能在前i个位置放多少点。

  转移:我们记录几个事儿。首先,R[i]表示所有区间中包含i且左端点最大的区间的左端点坐标。L[i]表示所有取件中右端点在i左侧且左端点最大的左端点坐标。关于L和R的更新显然是容易的,我们只需要再每加进来的区间里更新即可。然后转移方程就是f[i] = max { f[j] } + 1 ( L[i]<=j<=R[i] ) 。这个过程可以用单调队列来优化。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define N 200003
using namespace std;
int n,m,L[N],R[N];
int head,tail,q[N],f[N];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n+1;i++) R[i]=i-1;
for(int i=1;i<=m;i++)
{
int x,y; scanf("%d%d",&x,&y);
R[y]=min(R[y],x-1);
L[y+1]=max(L[y+1],x);
}
for(int i=n;i>=1;i--) R[i]=min(R[i+1],R[i]);
for(int i=2;i<=n+1;i++) L[i]=max(L[i-1],L[i]);
int j=1; head=tail=1; q[1]=0;
for(int i=1;i<=n+1;i++)
{
while(j<=R[i]&&j<=n)
{
if(f[j]==-1)
{
j++;
continue;
}
while(f[j]>f[q[tail]]&&head<=tail) tail--;
q[++tail]=j;
j++;
}
while(q[head]<L[i]&&head<=tail) head++;
if(head<=tail) f[i]=f[q[head]]+(i!=n+1?1:0);
else f[i]=-1;
}
printf("%d\n",f[n+1]);
}

  小结:贪心显然的题大部分好像都不是贪心,因为dp实在是太tm强了。

最新文章

  1. 关于利用bat文件调用exe批量处理文件下的文件的问题
  2. 基于nutz框架理解Ioc容器
  3. Angularjs学习---ubuntu12.04中karma安装配置中常见的问题总结
  4. 安卓图表引擎AChartEngine(一) - 简介
  5. Majority Element I&amp;II
  6. grep恢复误删除文件内容(转)
  7. 安装XCode导致mac无法正常开机怎么办
  8. Diary of Codeforces Round #402 (Div. 2)
  9. python 读取Excel(二)之xlwt
  10. Git - 可视化冲突解决工具P4Merge
  11. 关于Mybatis的一些随笔
  12. JQuery拖拽元素改变大小尺寸
  13. 用PMML实现机器学习模型的跨平台上线
  14. Swift可选项
  15. coon&#39;s patch
  16. 20175213 2018-2019-2 《Java程序设计》第3周学习总结
  17. day34 并发编程之生产者消费者模型 队列
  18. MVC 多submit
  19. Codeforces Round #427 (Div. 2) Problem A Key races (Codeforces 835 A)
  20. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)错误几种解决方案

热门文章

  1. Input 内提示填写内容
  2. PCB 自动发送邮件---加入表格实现方法
  3. PCB genesis大孔加小孔(即卸力孔)实现方法
  4. Java根据年度将数据分组
  5. HDU2564 词组缩写
  6. 简单认识http协议
  7. 每天学点Linux命令之 vi 命令
  8. C#图片辅助类,形成缩略图
  9. easyui textbox 内容改变事件 增加oninpu 类似事件,
  10. android计算屏幕dp