【NKOJ-昨天今天和明天】考试游记

本文介绍了使用单调栈解决LeetCode907题的变体问题,以及一系列涉及数组、区间优化和函数计算的算法题目。通过维护单调递增序列的结构体栈,解决了子数组最小值之和的问题。此外,文章还涉及到了捡垃圾的最短时间计算、多人进入教室的最优策略、数组中不同数字的数量统计以及三元组组合计数的动态规划问题,展示了多种算法在解决实际问题中的应用。
摘要由CSDN通过智能技术生成

目录

  • 昨天上午的序列 - 30pts
  • 今天上午的扫除 - 100pts
  • 明天上午的教室 - 100pts
  • 明天上午的数组 - 100pts
  • 明天上午的函数 - 100pts
题目排序太合理了,EDCBA依次变难,导致我对着A题苦思冥想了半小时...

但是A题是[LeetCode 907. 子数组的最小值之和]的换皮题(除了题目一点没变)然鹅我还是做不出正解

A-昨天上午的序列

在这里插入图片描述

这道题是一道单调栈的变式题;

首先经过推论我们可以得到对于一个数 a k a_k ak,它会成为 l l k × r r k × a k ll_k\times rr_k \times a_k llk×rrk×ak个区间所容纳,其中 l l k ll_k llk是它左边连续的大于它的数的个数, r r k rr_k rrk是它右边连续的大于等于它的数的个数;

我们现在就是要快速求出他们的值,很简单,用两个结构体栈维护单调递增的序列和其对应的下标即可;注意我下面两个while循环当中的比较!!!不然会WA的很惨

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;
int n,a[200005],ans=0,ll[200005],rr[200005];
struct lyt{
   
	int num,xp;//数值,下标
};
stack<lyt> l,r; 
signed main(){
   
	scanf("%lld",&n);for(int i=1;i<=n;i++){
   scanf("%lld",&a[i]);}
	l.push((lyt){
   0LL,0LL});r.push((lyt){
   0LL,n+1});//初始化成这样可以省掉边界的特判
	for
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值