,,,排序,从开始时间到结束时间模拟,用优先队列和映射保存位置
#include <bits/stdc++.h>
using namespace std;
#define maxn 100500
int n , k ;
struct node
{
int v;
int t;
};
node s[maxn];
node c[maxn];
int idx[maxn];
int idd[maxn];
int cmp(node a ,node b)
{
if( a.t == b.t )return a.v < b.v;
return a.t < b.t;
}
int main()
{
priority_queue<int,vector<int>,greater<int> > Q;
cin >> n >> k;
for(int i = 0 ; i < k ; ++i)
{
int w;
cin >> w >> s[i].t >> c[i].t;
c[i].t += s[i].t;
s[i].v = c[i].v = w;
}
for(int i = 1 ; i <= n ; ++i)
{
idd[i] = idx[i] = i;
}
sort( s , s + k , cmp );
sort( c , c + k , cmp );
int _st = s[0].t , _et = c[k-1].t;
int x = 0 , y = 0;
for(int i = _st ; i <= _et ; ++i)
{
while( c[y].t == i && y < k )
{
int temp = Q.top();
Q.pop();
idx[ c[y].v ] = temp;
idd[ temp ] = c[y].v;
y++;
}
while( s[x].t == i && x < k )
{
Q.push( idx[ s[x++].v ] );
}
}
for(int i = 1 ; i <= n ; ++i)
printf("%d ",idd[i]);
}