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 ;
}