优先队列,中间卡住了,帮忙看看
查看原帖
优先队列,中间卡住了,帮忙看看
1160571
MiKal6688楼主2024/11/18 16:54
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
const int maxn=2e5+10;
typedef long long ll;

struct cf{
	int num;
	ll s,t;
};
cf p[maxn];

struct ct{
	int cnum;
	ll t;
};

struct cmp{
	bool operator() ( ct a, ct b ){//默认是less函数
		//返回true时,a的优先级低于b的优先级(a排在b的后面)
		if( a.t== b.t ) return a.cnum> b.cnum; 
		return a.t> b.t;
	}
};

priority_queue<ct, vector<ct>, cmp> qg;
//priority_queue<int, vector<int>, greater<int> > q;
priority_queue<ct, vector<ct>, cmp> qk;
//stack<int> z;
vector<int> a[maxn];



bool cmpt(cf a,cf b){
	return a.t<b.t;
}

int main()
{
	int n,m;
	cin>>n>>m;
	
	for(int i=1;i<=n;i++){
		p[i].num=i;
		cin>>p[i].s>>p[i].t;
		
	}
	sort(p+1,p+n+1,cmpt);
	
	for(int i=m;i>=1;i--){
		qk.push({i,0});
	}
	
	//cout<<endl;
	for(int i=1;i<=n;i++){
		int time=p[i].t;
		//cout<<time<<endl;
		while(!qg.empty()){
			if(qg.top().t<=time){
				qk.push({qg.top().cnum,0});
				//cout<<qg.top().cnum<<endl;
				qg.pop();
			}
		}
		if(qk.empty()){
			ll more=qg.top().t;
			p[i].t=more;
			i--;
			continue;
		}
		qg.push({qk.top().cnum,time+p[i].s});
		a[qk.top().cnum].push_back(i);
		//cout<<i<<endl;
		qk.pop();
	}
	
	for(int i=1;i<=m;i++){
		cout<<i<<" ";
		for(int j=0;j<a[i].size();j++){
			cout<<a[i][j]<<" ";
		}
		cout<<endl;
	}
	
	return 0;
}
2024/11/18 16:54
加载中...