bzoj2276: [Poi2011]Temperature(单调队列/堆)
这题有两种写法,而且是完全(几乎?)不一样的写法...并不是换了个方法来维护而已
单调队列O(N):用一个队列维护a[]的单调递减,对于每个i满足a[队头]<=b[i],然后就可以算出以每一位为结尾的最大答案了
#include<stdio.h>
#include<cstring>
#include<iostream>
#include<cstdlib>
using namespace std;
const int maxn=,inf=1e9;
int n,fir,ans;
int a[maxn],b[maxn],q[maxn];
inline void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
int main()
{
read(n);
for(int i=;i<=n;i++)read(a[i]),read(b[i]);
int l=,r=;fir=;
for(int i=;i<=n;i++)
{
while(l<=r&&a[q[l]]>b[i])fir=max(fir,q[l++]+);
ans=max(ans,i-fir+);
while(l<=r&&a[q[r]]<=a[i])r--;
q[++r]=i;
}
printf("%d\n",ans);
}
堆O(Nlogn):
比赛时候的写法...实在没想到单调队列
用two pointers,从l,r要扩展到l,r+1的时候只需要判断l~r里最大的a[]是不是<=b[r+1]就可以扩展了,这个可以用堆维护,左指针移动的时候删去堆中左指针的数。
#include<stdio.h>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<queue>
using namespace std;
const int maxn=,inf=1e9;
struct poi{int sum,pos;};
priority_queue<poi>q;
bool operator<(poi a,poi b){return a.sum<b.sum;}
int n,ans;
int a[maxn],b[maxn];
bool v[maxn];
inline void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
inline int find()
{
if(q.empty())return -inf;
poi t;for(t=q.top();v[t.pos]&&(!q.empty());q.pop(),t=q.top());
return q.empty()?-inf:t.sum;
}
int main()
{
read(n);
for(int i=;i<=n;i++)read(a[i]),read(b[i]);
for(int i=,j=;j<=n;i++)
{
j=max(i,j);
for(int t=find();j<=n;j++,t=find())
{
if(t>b[j])break;
q.push((poi){a[j],j});
ans=max(ans,j-i+);
}
v[i]=;
}
printf("%d\n",ans);
}
这个其实也是可以用单调队列来维护的...之前想错导致我LOJ D2 T2被坑了T T
单调队列可以兹磁找到队列中最值和删去最早的值两种操作...
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=, inf=1e9;
int n, L, R, ans;
int l[maxn], r[maxn], q[maxn];
void read(int &k)
{
int f=; k=; char c=getchar();
while(c<'' || c>'') c=='-' && (f=-), c=getchar();
while(c<='' && c>='') k=k*+c-'', c=getchar();
k*=f;
}
inline int max(int a, int b){return a>b?a:b;}
inline void qpush(int x)
{
while(L<=R &&l[q[R]]<=l[x]) R--;
q[++R]=x;
}
int main()
{
read(n);
for(int i=;i<=n;i++) read(l[i]), read(r[i]);
L=; R=;
for(int i=, j=;i<=n;i++)
{
j=max(i, j);
while(j<=n && ((L<=R)?l[q[L]]:-inf)<=r[j]) qpush(j++);
ans=max(ans, j-i);
if(q[L]==i) L++;
}
printf("%d\n", ans);
}
bzoj2276: [Poi2011]Temperature(单调队列/堆)的更多相关文章
- BZOJ 2276: [Poi2011]Temperature 单调队列
Code: #include<bits/stdc++.h> #define maxn 3000000 using namespace std; void setIO(string s) { ...
- bzoj 2276: [Poi2011]Temperature——单调队列
Description 某国进行了连续n天的温度测量,测量存在误差,测量结果是第i天温度在[l_i,r_i]范围内. 求最长的连续的一段,满足该段内可能温度不降 第一行n 下面n行,每行l_i,r_i ...
- BZOJ2276 [Poi2011]Temperature 【单调队列】
题目链接 BZOJ2276 题解 一开始看错题,以为求的是可以不连续的,想出一个奇怪的线段树,发现空间根本开不下?? 题目要我们求连续的最长可能不下降区间 对于区间\([l,r]\)如果合法,当且仅当 ...
- BZOJ2276: [Poi2011]Temperature
2276: [Poi2011]Temperature Time Limit: 20 Sec Memory Limit: 32 MBSubmit: 293 Solved: 117[Submit][S ...
- 【POJ 2823】Sliding Window(单调队列/堆)
BUPT2017 wintertraining(16) #5 D POJ - 2823 题意 给定n,k,求滑窗[i,i+k-1]在(1<=i<=n)的最大值最小值. 题解 单调队列或堆. ...
- POJ 3017 DP + 单调队列 + 堆
题意:给你一个长度为n的数列,你需要把这个数列分成几段,每段的和不超过m,问各段的最大值之和的最小值是多少? 思路:dp方程如下:设dp[i]为把前i个数分成合法的若干段最大值的最小值是多少.dp转移 ...
- 洛谷P1725 琪露诺 (单调队列/堆优化DP)
显然的DP题..... 对于位置i,它由i-r~i-l的位置转移过来,容易得到方程 dp[i]=dp[i]+max(dp[i−r],...,dp[i−l]). 第一种:n2的暴力,只能拿部分分. 1 ...
- poj3017 Cut the Sequence 单调队列 + 堆 dp
描述 把一个正数列 $A$分成若干段, 每段之和 不超过 $M$, 并且使得每段数列的最大值的和最小, 求出这个最小值. 题目链接 题解 首先我们可以列出一个$O(n^2)$ 的转移方程 : $F_i ...
- bzoj 2276 [ Poi 2011 ] Temperature —— 单调队列
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2276 维护 l 递减的单调队列,队头的 l > 当前的 r 就出队,因为不能是连续一段 ...
随机推荐
- 生鲜水果商城PC手机微信完整版源码2018版(免费)
采用php+mysql架构,含有PC.手机.微信三端,只需要修改一下数据库配置,并恢复一下数据即可使用,还有微信.支付宝等接口,如有问题请在文章下面留言一下,我看到会协助一下的,下载包里面含有详细的安 ...
- 「日常训练」Girls and Boys(HDU-1068)
题意 有n个同学,给出同学之间的爱慕关系,选出一个集合使得集合中的人没有爱慕关系.问能选出的最大集合是多少. 分析 二分图的最大独立集. 最大独立集的意思是,在图中选出最多的点,使他们两两之间没有边, ...
- beauifulsoup模块的介绍
01 爬虫基础知识介绍 相关库:1.requests,re 2.BeautifulSoup 3.hackhttp 使用requests发起get,post请求,获取状态码,内容: 使用re匹 ...
- myeclipse tomcat部署按钮点击没反应
进入workspace目录,删除.metadata\.plugins\org.eclipse.core.runtime\.settings\com.genuitec.eclipse.ast.deplo ...
- 【rich-text】 富文本组件说明
[rich-text] 富文本组件可以显示HTML代码样式. 1)支持事件:tap.touchstart.touchmove.touchcancel.touchend和longtap 2)信任的HTM ...
- Java开发中用的比较多的数据结构
java 中几种常用数据结构 2016年07月11日 09:11:27 阅读数:83211 标签: 数据结构java 更多 个人分类: 自行学习 JAVA中常用的数据结构(java.util. 中 ...
- LeetCode 94 ——二叉树的中序遍历
1. 题目 2. 解答 2.1. 递归法 定义一个存放树中数据的向量 data,从根节点开始,如果节点不为空,那么 递归得到其左子树的数据向量 temp,将 temp 合并到 data 中去 将当前节 ...
- 一些容易记混的c++相关知识点
一些容易记混的c++相关知识. 截图自:<王道程序员面试宝典>
- springboot 整合apache shiro
这几天因为项目需要,学习了下shiro,由此留下一些记录,也希望对初学shiro的朋友有帮助. springboot 是这两年新兴起来的一个项目,它的出现是为了减少springmvc开发过程中需要引入 ...
- ACM 第五天
匈牙利算法(二分图匹配) C - Courses Consider a group of N students and P courses. Each student visits zero, one ...