ICPC2021第一场网络预选赛A题

ICPC2021第一场网络预选赛A题

A题题意大概就是有n台机器,有m个待运行的程序,输入会给定机器数量,还有每个程序的到达时间和运行时间,求所有处理程序最多的机器,按机器下标排输出。
ps(第i个程序到达时会从第i%n台机器开始寻找第一台空闲机器,那么就是从i%n - n 寻找第一台空闲机器,如果没有空闲机器,就从1 - (i%n - 1)寻找,若所有机器都不空闲,则此程序丢弃)

解题思路:从题意我们可以解析出每个程序其实是在i%n - n 和1 - (i%n - 1)
两个区间寻找第一台空闲机器,看到区间询问我就想到了线段树。那么我们考虑线段树可以维护什么东西,可以发现每一台机器能否去执行当前程序,只需判断当前机器的空闲时间是否小于当前程序的到达时间。如果我们线段树节点存储每一台机器的空闲时间,那么就可以log^n的复杂度查询任意一个区间是否存在一台空闲机器可以处理当前程序,因为题意需要找到第一台空闲机器,而这可以转化成一个求区间存在性问题,那么就可以使用二分求区间存在性来求解第一台空闲机器。所以这个题就可以使用线段树+二分来求解,时间复杂度O(log2n * n)。PS(赛场AC代码忘记保存,此代码为赛后手撸,不保证AC)

#include"iostream"
#include"algorithm"

using namespace std;
typedef long long ll;
const int N = 1e5 + 10;

struct node
{
   
	int l, r;
	ll val;
}tr[N * 4];
int cnt[N];
ll last[N];

void pushup(int u)
{
   
	tr[u].val = min(tr[u << 1].val, tr[u << 1 | 1].val);
}

void build(int u,int l,int r)
{
   
	if(l == r)tr[u] = {
   l, r}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值