当前位置: 首页 > news >正文

POJ-2823 POJ-3250 (单调队列 单调栈)

poj-2823: 求n个数序列中的所有段长度为k的区间内的最大值和最小值。

poj-3250: 求n个数序列中每个位置的右边的数小于其数值的个数,并且中间不能有大于等于它的数。


poj-2823 下面这份代码只能在c++编译器下才能过,其它编译器超时,其实只需要在出队的时候加个二分优化就能过,但懒得改了,主要是学单调队列的做法。

#include <cstdio>
using namespace std;
const int maxn = 1e6+5;
int a[maxn], ans1[maxn], ans2[maxn];
int q1[maxn], q2[maxn];
int head1, tail1, head2, tail2;
int n, k;
int main()
{
	//freopen("in.txt", "r", stdin);
	scanf("%d %d", &n, &k);
	head1 = tail1 = 0;
	head2 = tail2 = 0;
	for(int i = 1; i < k; ++i)
	{
		scanf("%d", &a[i]);
		while(head1 < tail1 && a[q1[tail1-1]] >= a[i]) --tail1;
		q1[tail1++] = i;
		while(head2 < tail2 && a[q2[tail2-1]] <= a[i]) --tail2;
		q2[tail2++] = i;
	}
	for(int i = k; i <= n; ++i)
	{
		scanf("%d", &a[i]);
		while(head1 < tail1 && q1[head1] < i-k+1) ++head1;
		while(head1 < tail1 && a[q1[tail1-1]] >= a[i]) --tail1;
		q1[tail1++] = i;
		while(head2 < tail2 && q2[head2] < i-k+1) ++head2;
		while(head2 < tail2 && a[q2[tail2-1]] <= a[i]) --tail2;
		q2[tail2++] = i;
		ans1[i] = a[q1[head1]];
		ans2[i] = a[q2[head2]];
	}
	for(int i = k; i <= n; ++i)
	printf("%d%c", ans1[i], i==n?'\n':' ');
	for(int i = k; i <= n; ++i)
	printf("%d%c", ans2[i], i==n?'\n':' ');
	return 0;
}


poj-3250 自己先写了个丑的单调栈,然后又写了一个跟网上一样的简短代码。

#include <cstdio>
#define ll long long
using namespace std;
const int maxn = 8e4+5;
int n, a[maxn];
int top, sk[maxn];
ll res, ans[maxn];
int main()
{
	scanf("%d", &n);
	res = 0; top = 0;
	for(int i = 1; i <= n; ++i)
	scanf("%d", &a[i]);
	for(int i = n; i >= 1; --i)
	{
		int tmp = 0;
		while(top > 0 && a[sk[top]] < a[i]) tmp += ans[sk[top]], --top;
		res += tmp;
		ans[i] = tmp+1;
		sk[++top] = i;
	}
	printf("%lld\n", res);
	return 0;
}


#include <cstdio>
#define ll long long
using namespace std;
const int maxn = 8e4+5;
int n, a[maxn];
int top, sk[maxn];
ll ans;
int main()
{
	scanf("%d", &n);
	ans = 0; top = 0;
	for(int i = 1; i <= n; ++i)
	{
		scanf("%d", &a[i]);
		while(top > 0 && a[sk[top]] <= a[i]) --top;
		ans += top;
		sk[++top] = i;
	}
	printf("%lld\n", ans);
	return 0;
} 


继续加油~

相关文章:

  • 关于量价十八则的口诀
  • HDU-3478 Catch(二分图染色+并查集)
  • RSA密钥的生成与配置
  • POJ 2536 Gopher II
  • HDU-1043 Eight(经典八数码问题, A*+康拓+曼哈顿距离+逆序数判断可解性、双向搜索)
  • codeforces-510E Fox And Dinner(带限制的二分图多重匹配+奇偶建图+打印路径)
  • C-Cleaning Pipes(判断两线段相交+二分图判定) 2015-2016 Northwestern European Regional Contest (NWERC 2015)
  • eclipse the user operation is waiting for building workspace to complete
  • 2-SAT 题目整理
  • 64位windows2003 未在本地计算机上注册 microsoft.jet.oledb.4.0 提供程序
  • HDU-5950 Recursive sequence(矩阵乘法)
  • “互联网+”引发IT人才招工荒-新华网安徽频道
  • Java从文件读入以及读出至文件
  • HDU-5963 朋友(树上博弈)
  • HDU 6005 Pandaland(无向图最小环)
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Android Volley源码解析
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • CentOS 7 防火墙操作
  • HTTP--网络协议分层,http历史(二)
  • JavaScript服务器推送技术之 WebSocket
  • Mac转Windows的拯救指南
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Puppeteer:浏览器控制器
  • redis学习笔记(三):列表、集合、有序集合
  • SQLServer之创建显式事务
  • Swoft 源码剖析 - 代码自动更新机制
  • Twitter赢在开放,三年创造奇迹
  • uva 10370 Above Average
  • 关于使用markdown的方法(引自CSDN教程)
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 小试R空间处理新库sf
  • 写代码的正确姿势
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 如何用纯 CSS 创作一个货车 loader
  • ​configparser --- 配置文件解析器​
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #控制台大学课堂点名问题_课堂随机点名
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Oracle)SQL优化技巧(一):分页查询
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)scrum常见工具列表
  • .cfg\.dat\.mak(持续补充)