优先队列60tps求调,大样例和讨论区的样例都过了
查看原帖
优先队列60tps求调,大样例和讨论区的样例都过了
1189662
hujianyue_i楼主2024/11/18 23:31
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;

struct node{
	int s,t,id;
}s[320010];

struct no{
	int ti,id;
};
bool operator <(no a,no b){
	return a.ti>b.ti;
}
bool cmp(node a,node b){
	return a.t<b.t;
}

priority_queue<no> q2;
priority_queue<int, vector<int>, greater<int>> q;
vector <int> g[320010];

signed main(){
	//freopen("print4.in","r",stdin);
	//freopen("print4.ans","w",stdout);
	cin>>n>>m;
	for (int i=1;i<=n;i++){
		cin>>s[i].s>>s[i].t;
		s[i].id=i;
	}
	sort(s+1,s+n+1,cmp);
	for (int i=1;i<=m;i++){
		q.push(i);
	}
	for(int i=1;i<=n;i++){
		while((!q2.empty()) && q2.top().ti<=s[i].t){
			q.push(q2.top().id);
			q2.pop();
		}
		if(q.empty()){
			int u=q2.top().id;
			int ti=q2.top().ti;
			q2.pop();
			g[u].push_back(s[i].id);
			q2.push((no){ti+s[i].s,u});
		}
		else{
			int u=q.top();
			g[u].push_back(s[i].id);
			q.pop();
			q2.push((no){s[i].s+s[i].t,u});
		}
	}
	for (int i=1;i<=m;i++){
		cout<<g[i].size()<<' ';
		sort(g[i].begin(),g[i].end());
		for (int j=0;j<g[i].size();j++){
			cout<<g[i][j]<<' ';
		}
		cout<<endl;
	}
	return 0;
}
2024/11/18 23:31
加载中...