找区间内第一个比x小(大)的数(线段树/单调栈)(ACM-ICPC 2018 南京赛区网络预赛 B G题解)

这篇博客介绍了在2018年ACM-ICPC南京赛区网络预赛中的两道题目,分别涉及线段树和单调栈的应用。第一题‘Lpl and Energy-saving Lamps’通过线段树模拟换灯过程,求解在特定月份完成的任务和剩余灯具。第二题‘The writing on the wall’利用单调栈和动态规划计算矩形数量,解决挖空矩形问题。文章详细解析了两题的思路和算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ACM-ICPC 2018 南京赛区网络预赛  G Lpl and Energy-saving Lamps

题目链接

题意:

有n个房间,每个房间有k[i]栈台灯。现在你要把所有房间的台灯换成新的节能台灯

你在每个月一开始会买m栈节能台灯。

换台灯的规则是先从列表上的第一个房间开始,如果当前房间的台灯数量<你拥有的节能台灯的数量,

那么就全部把他换掉,同时把这个房间从列表上清除。否则的话就跳过这个房间,进入下一个房间。

直到你手里的节能台灯数量为0,或者是所有在列表上的房间都遍历过一遍,那么这个月的任务就结束。

你剩余的节能台灯在下一个月还可以使用。如果某个月结束后,所有房间都换过了,那么你就不会再取买

节能台灯了

q个询问,每一个询问一个di,问你在di月结束的时候,你换了几个房间,手里剩余多少节能台灯

n<=1e5,m<=100,di<=1e5,ki<=1e4,q<=1e5

 

解析:

这里我是直接正面求解,模拟每一次换台灯的过程。

换完一个房间j,换下一个房间,就是在[j+1,n]里面找第一个小于当前节能台灯数量money的房间,

然后我就是用线段树来模拟的,维护区间最小值,查询的时候加一些剪枝(不然会T)

因为每一个房间只会被删除一次,那么时间复杂度接近为O(nlogn)

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
#define Min(a,b) a>=b?b:a;
#define Max(a,b) a>=b?a:b;
const int MAXN = 1e5+100;
const int INF = 0x3f3f3f3f;

int b[MAXN];
char str[10];
#define lch root<<1
#define rch (root<<1)|1
typedef long long ll;

 

typedef struct node
{
	int ans;
	int minn;
	int pos;
}node;

node Btree[MAXN*5];
int res[MAXN][2];

inline void push_up(int root)
{
	/*if(Btree[lch].minn>Btree[rch].min
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值