仓鼠的鸡蛋(线段树+二分)

本文介绍如何在牛客网的C++编程题中,利用STL中的`vector`和`set`实现高效的动态更新和查找操作。通过`push_up`和`update`函数,我们探讨了如何在区间更新和查询最大值的树状结构中提高性能。适合IT技术笔试面试准备。

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

登录—专业IT笔试面试备考平台_牛客网

#include<bits/stdc++.h>
#define lowbit(x) ((x)&(-x))
//#define int long long
using u64 = unsigned long long;
using namespace std;
std::mt19937_64 rng;
const int N=3e5+10;
typedef pair<int,int>PII;
vector<int > vs;
int m,n,k;

struct pp
{
	int l,r,ma,k;
} tr[N*4];


void push_up(int node)
{
	tr[node].ma =max(tr[node*2].ma ,tr[node*2+1].ma);
}

void build(int node,int l,int r)
{
	tr[node]= {l,r};
	if(l==r)
	{
		tr[node]= {l,r,m,k};
		return ;
	}
	int mid=(l+r) /2;
	build(node*2,l,mid);
	build(node*2+1,mid+1,r);
	push_up(node);
}

int update(int node,int val)
{
	if(tr[node].ma < val) return -1;
	if(tr[node].l==tr[node].r)
	{
		tr[node].ma -=val;
		tr[node].k--;
		if(tr[node].k==0) tr[node].ma =0;
		return tr[node].l;
	}
	int ans;
	if(tr[node*2].ma >= val) ans= update(node*2,val);
	else ans= update(node*2+1,val);
	push_up(node);
	return ans;
}

signed main()
{
	int i,j,w,a1;
	scanf("%d",&w) ;
	while(w--)
	{
		scanf("%d%d%d",&n,&m,&k);
		build(1,1,n);
		for(i=1; i<=n; i++)
		{
			scanf("%d",&a1);
			printf("%d\n",update(1,a1));
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值