poj 2823 二分法+单调队列
#include<stdio.h>
#include<string.h>
#define N 1100000
int a[N];
int fmin[N],fmax[N];
int tmin[N],tmax[N];
int dicmax(int l,int r,int f[],int k) {
int mid;
while(l<=r) {
mid=(l+r)/2;
if(k>=f[mid])//
r=mid-1;
else
l=mid+1;
}
return l;//这里的r返回第一个大于k的数的位置-1
}
int dicmin(int l,int r,int f[],int k) {
int mid;
while(l<=r) {
mid=(l+r)/2;
if(k<=f[mid])
r=mid-1;
else
l=mid+1;
}
return l;//
}
int main() {
int n,k,i,j,front,end;
while(scanf("%d%d",&n,&k)!=EOF) {
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
front=end=1;
fmin[front]=a[1];
tmin[front]=1;
for(i=2;i<=k;i++) {
end=dicmin(front,end,fmin,a[i]);
// printf("%d\n",end);
fmin[end]=a[i];
tmin[end]=i;
}
printf("%d",fmin[front]);
for(i=k+1;i<=n;i++) {
end=dicmin(front,end,fmin,a[i]);
fmin[end]=a[i];
tmin[end]=i;
while(tmin[front]<i-k+1&&front<=end)
front++;
printf(" %d",fmin[front]);
}
printf("\n");
front=end=1;
fmax[1]=a[1];
tmax[1]=1;
for(i=2;i<=k;i++) {
end=dicmax(front,end,fmax,a[i]);
fmax[end]=a[i];
tmax[end]=i;
}
printf("%d",fmax[front]);
for(i=k+1;i<=n;i++) {
end=dicmax(front,end,fmax,a[i]);
fmax[end]=a[i];
tmax[end]=i;
while(tmax[front]<i-k+1&&front<=end)
front++;
printf(" %d",fmax[front]);
}
printf("\n");
}
return 0;}
poj 2823 二分法+单调队列的更多相关文章
- POJ 2823【单调队列】
题意: 给出序列,找出每个连续长度为k的子序列的最大值和最小值. 思路: 裸单调队列... 单调队列这东西用的真的非常局限,大概只能用到这种情景中== 简单说一下维护: 添加元素,为了保持单调性,排除 ...
- poj 1821 Fence 单调队列优化dp
/* poj 1821 n*n*m 暴力*/ #include<iostream> #include<cstdio> #include<cstring> #incl ...
- POJ 3017 DP + 单调队列 + 堆
题意:给你一个长度为n的数列,你需要把这个数列分成几段,每段的和不超过m,问各段的最大值之和的最小值是多少? 思路:dp方程如下:设dp[i]为把前i个数分成合法的若干段最大值的最小值是多少.dp转移 ...
- POJ 1742 Coins ( 单调队列解法 )
id=1742" target="_blank">题目链接~~> 做题感悟:第一次做的时候用的二进制优化.可是没注意到是险过.so也没去看单调队列的解法. 解 ...
- Dividing the Path POJ - 2373(单调队列优化dp)
给出一个n长度的区间,然后有一些小区间只能被喷水一次,其他区间可以喷水多次,然后问你要把这个区间覆盖起来最小需要多少喷头,喷头的半径是[a, b]. 对于每个只能覆盖一次的区间,我们可以把他中间的部分 ...
- 刷题总结——Cut the Sequence(POJ 3017 dp+单调队列+set)
题目: Description Given an integer sequence { an } of length N, you are to cut the sequence into sever ...
- POJ 1821 Fence(单调队列优化DP)
题解 以前做过很多单调队列优化DP的题. 这个题有一点不同是对于有的状态可以转移,有的状态不能转移. 然后一堆边界和注意点.导致写起来就很难受. 然后状态也比较难定义. dp[i][j]代表前i个人涂 ...
- POJ 1742 (单调队列优化多重背包+混合背包)
(点击此处查看原题) 题意分析 给你n种不同价值的硬币,价值为val[1],val[2]...val[n],每种价值的硬币有num[1],num[2]...num[n]个,问使用这n种硬币可以凑齐[1 ...
- POJ 2823 Sliding Window + 单调队列
一.概念介绍 1. 双端队列 双端队列是一种线性表,是一种特殊的队列,遵守先进先出的原则.双端队列支持以下4种操作: (1) 从队首删除 (2) 从队尾删除 (3) 从队尾插入 (4) ...
随机推荐
- loadrunner11 安装破解,汉化包
说说自己的心痛史,好不容易安装了loadrunner 11 居然浏览器不支持,我的系统是win8.1,ie浏览器最低支持ie11,我还能说啥子...其他浏览器试过了依旧是不可以!!所以我安装了一个虚拟 ...
- 数学 HDOJ 5301 Buildings
题目传送门 /* 题意:n*m列的矩阵,删除一个格子x,y.用矩形来填充矩阵.且矩形至少有一边是在矩阵的边缘上. 求满足条件的矩形填充方式中面积最大的矩形,要使得该最大矩形的面积最小. 分析:任何矩形 ...
- {Python}安装第三方包(setup.py)
在github上下载了records文件到本地. 解压文件 cmd切换到文件setup.py的目录下 先执行 python setup.py build 再执行python setup.py inst ...
- C#基础 特殊集合
//stack 干草堆 //先进后出 进 push 出 pop //初始化 //Stack ss = new Stack(); //ss.Push(1); //ss.Push(2); //ss.Pus ...
- linux 常用shell命令之wc
wc:查看文件统计信息 用法:$ wc filename 1. $ wc fileName $ wc fileName X Y Z /Desktop/hello X:表示行数 Y:表示单词数 Z:表示 ...
- Android Could not find com.afollestad:material-dialogs:0.7.6.0 解决
AS报错:Could not find com.afollestad:material-dialogs:0.7.6.0 网上没有解决方案: 解决: 将用: compile('com.afollesta ...
- Windows IIS 集成PHP时修改PHP.ini 配置后不生效问题
iis下修改c://windows/php.ini 重启iis的网站不生效.需要重启应用程序池即可生效.
- MySQL详解(18)-----------分页方法总结
---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适应场景: 适用于数据量较少的情况(元组百/千 ...
- npm——nrm
nrm 是镜像地址,方便国内下载 npm i nrm -g nrm ls nrm use taobao // 切换地址
- java正则表达式匹配字符
假设要匹配${2}中间为数字的这个类型的变量String,则 Pattern p = Pattern.compile("\\$\\{\\d+\\}"); Matcher m = p ...