[bzoj3126][USACO2013]Photo_动态规划_单调队列
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强了。
[bzoj3126][USACO2013]Photo_动态规划_单调队列的更多相关文章
- [bzoj1855][Scoi2010]股票交易_动态规划_单调队列
股票交易 bzoj-1855 Scoi-2010 题目大意:说不明白题意系列++...题目链接 注释:略. 想法:这个题还是挺难的. 动态规划没跑了 状态:dp[i][j]表示第i天手里有j个股票的最 ...
- [bzoj1047][HAOI2007]理想的正方形_动态规划_单调队列
理想的正方形 bzoj-1047 HAOI-2007 题目大意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 注释:$2\le a, ...
- [NOI2005]瑰丽华尔兹_动态规划_单调队列
Code: #include<cstdio> #include<cstring> #include<deque> #include<algorithm> ...
- [bzoj4368][IOI2015]boxes纪念品盒_动态规划_单调队列_贪心
bzoj4368 IOI2015 boxes纪念品盒 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=4368 数据范围:略. 题解: 如果在一个最 ...
- 【BZOJ2442】修建草坪(动态规划,单调队列)
[BZOJ2442]修建草坪(动态规划,单调队列) 题面 权限题..洛谷 题解 设\(f[i]\)表示前\(i\)个里面选出来的最大值 转移应该比较显然 枚举一个断点的位置,转移一下就好 \(f[i] ...
- 【BZOJ1855】股票交易(动态规划,单调队列)
[BZOJ1855]股票交易(动态规划,单调队列) 题面 BZOJ 题解 很显然,状态之和天数以及当天剩余的股票数有关 设\(f[i][j]\)表示第\(i\)天进行了交易,剩余股票数为\(j\)的最 ...
- BZOJ_1342_[Baltic2007]Sound静音问题_单调队列
BZOJ_1342_[Baltic2007]Sound静音问题_单调队列 题意: 给出n个数,求∑[ max{a[i]~a[i+m-1]} - min{a[i]~a[i+m-1]} <= c ] ...
- BZOJ_2343_[Usaco2011 Open]修剪草坪 _单调队列_DP
BZOJ_2343_[Usaco2011 Open]修剪草坪 _单调队列_DP 题意: N头牛,每头牛有一个权值,选择一些牛,要求连续的不能超过k个,求选择牛的权值和最大值 分析: 先考虑暴力DP,f ...
- 【CF1133E】K Balanced Teams(动态规划,单调队列)
[CF1133E]K Balanced Teams(动态规划,单调队列) 题面 CF 让你把一堆数选一些出来分成不超过\(K\)组,每一组里面的最大值和最小值之差不超过\(5\),求最多有多少个人元素 ...
随机推荐
- 一、Linux文件权限与目录配置
行文结构如下: 用户和用户组 Linux文件权限概念 Linux目录配置 重点回顾 1.用户与用户组 Linux是个多用户.多任务的系统,可能有多人同时使用这台机器进行工作,为了考虑每个人的隐私和工作 ...
- PCB 第一个node.js应用
一.Node安装地址: https://nodejs.org/zh-cn/ 二.Node第一个应用实例 启动webnode.js应用: node webnode.js webnode.js代码: va ...
- BZOJ 3514 LCT+主席树
思路: //By SiriusRen #include <bits/stdc++.h> using namespace std; ; ],fa[N],minn[N],rev[N],q[N] ...
- 最近几道hihocode不会做的题目
几个易错点 1.数据范围一定要开大,一般多开10个或者5个. 2. 从经常写 int a[n], 然后访问a[n], 这显然会下标越界. 3. 浮点数,无法精确的比较,等于,大于,小于, 都需要使用e ...
- CF414B Mashmokh and ACM
思路: dp. 实现: 1.O(n5/2) #include <iostream> #include <cstdio> using namespace std; ; ][]; ...
- PB连接SQLITE
sqlite3数据库,简单而功能强大,比起ini文件保存用户设置,更简单安全,为什么使用数据库存用户设置,由开发者自己去想吧进入话题:pb中可以用ole DB方式在不注册odbc的情况下直接连接数据库 ...
- Java class对象说明 Java 静态变量声明和赋值说明
先看下JDK中的说明: java.lang.Object java.lang.Class<T> Instances of the class Class represent cla ...
- 【译】x86程序员手册05 - 2.3寄存器
2.3 Registers 寄存器 The 80386 contains a total of sixteen registers that are of interest to the applic ...
- Linux基础之网络协议
互联网通信原理 从物理层面来说,每台计算机在一开始都是彼此孤立的,为了实现信息的交流与共享,计算机之间必须要建立通信网络.例如人与人之间的交流,他们必须要共用一套语言系统,才能交流成功.计算机之间也是 ...
- Springboot使用JdbcTemplate RowMapper查询,直接返回实体列表
ManagerRowMapper.java public class ManagerRowMapper implements RowMapper<Manager>{ @Override p ...