Busiest Computing Nodes

A Busiest Computing Nodes

弱鸡改了好多遍改对了
线段树维护,左右端点,以及最小值
如果当前的机器时间不允许, 先询问后面, 再询问前面
代码

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5+10;
const int INF = 0x3f3f3f3f ; 
struct node 
{
	int l ,r; 
	int min_time ; 
}tr[N*4] ;
int n, k ; 
int ti[N] ;
int ans[N] ; 
void push_up(node &u , node &l , node &r ) 
{
	u.min_time = min(l.min_time ,r.min_time ); 
}

void build(int u , int l ,int r ) 
{
	if(l == r ) 
	{
		tr[u] = {l , r , 0 } ;
		return ;
	}
	tr[u] = {l, r } ;
	int mid = l +r >> 1 ;
	build(u << 1 , l , mid ) ,build(u << 1 | 1 , mid + 1 ,r  );
	push_up(tr[u] , tr[u << 1 ] , tr[u << 1 | 1] ) ; 
}

int query(int u, int l , int r , int z ) 
{
	//cout<<"min_time:"<<tr[u].min_time <<" "<<l<< " "<<r << endl;
	//cout<<"lrmin_time:"<<tr[u].l <<" " <<tr[u].r <<" " <<tr[u].min_time  <<endl; 
	if(tr[u].min_time >= z ) return INF;
	if(tr[u].l == tr[u].r && tr[u].min_time < z  ) {
		
	//cout<<"-12-------------" ;
	return tr[u].l ;
	
	}
	int res =INF ;
	if(tr[u].l >= l && tr[u].r <=r ) 
	{
		if(tr[u << 1 ].min_time < z) return query(u << 1 , l , r , z ); 
		if(tr[u << 1 | 1].min_time < z ) return query(u<<1 | 1 , l , r ,z ) ;
			
	}
		int mid = tr[u].l + tr[u].r >> 1 ;
		if(l <= mid)  res = min(res , query(u << 1 , l , r , z )) ;
		if(r > mid ) res = min(res , query(u<<1 | 1 , l , r, z )) ;
	return res ;
}

void modify(int u , int v , int z )
{
	
	if(tr[u].l == tr[u].r && tr[u].r == v) 
	{
		tr[u].min_time = z ; 
		ti[v]= z ; 
		return ;
	}
	int mid = tr[u].l + tr[u].r >>1 ;
	if(v <=mid ) modify(u << 1 , v , z ) ;
	if(v > mid ) modify(u << 1 | 1 , v , z );
	push_up(tr[u], tr[u << 1 ] , tr[u << 1 | 1]);
}

int main()
{
	cin>>n >>k;
	build(1 , 1 , n ) ;
	int l , len ; 
	int maxx = 0 ; 
	for(int i = 0 ;i < k ;i  ++ ) 
	{
		cin>>l>>len ;
		if(ti[i % n +1 ] < l ) 
		{
			ans[i % n + 1  ] ++ ;
			modify(1 , i %n + 1 , l + len  -1 ) ;
			maxx = max(maxx , ans[i %n  + 1 ]) ; 
			
		}
		else {
		
			int res = query(1 ,i % n + 1 , n ,l ) ;
		//	cout <<"res:"<<res <<endl;
			if(res == INF ) res =query(1 , 1 , i % n  ,l ) ; 
			//cout<<"res :"<<res <<endl;
			if(res == INF) continue;
			ans[res] ++ ;
			//cout<<" --  " <<res <<endl;
			maxx = max(maxx , ans[res ]) ;
			modify(1 , res , l + len - 1 ) ;
		}
	
	}
	
	vector<int>num;
	for(int i = 1 ; i <= n ; i ++ ) 
	{
		if(ans[i] == maxx ) num.push_back(i - 1 ) ;
	}
	for(int i = 0 ; i<num.size() ; i ++ ) 
	{
		cout<<num[i] ;
		if(i != num.size()- 1 ) cout<<" " ;
	 } 
	
	return 0 ; 
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值