60pts求调 玄关
查看原帖
60pts求调 玄关
1125784
shuidianfei楼主2024/11/23 19:37

使用双堆做法,样例全过,实际60pts

#include<bits/stdc++.h>
#define ll long long
#define MAX 200010
using namespace std;
int n,m;

struct node{
	ll start,finish,in_num,print_num;
	friend bool operator < (const node x,const node y){
		return x.finish>y.finish ||(x.finish==y.finish && x.in_num>y.in_num); 
	}
};
priority_queue<node>print;

vector<node>in;
bool incmp(const node x,const node y){
	return x.start<y.start;
}

vector<ll>out[MAX];

class minqueue{
	public:
		priority_queue<ll> q;
		void push(ll x){
			q.push(-x);
		} 
		void pop(){
			q.pop();
		}
		ll top(){
			return -q.top();
		}
};
minqueue minq;

void print_in(){
	for(int i=0;i<n;i++){
		cout<<in[i].start<<" "<<in[i].finish<<" "<<in[i].in_num<<" "<<in[i].print_num<<"\n";
	}
}

int main(){
	//freopen("out.txt","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		ll start,times;
		scanf("%lld%lld",&times,&start);
		node x;
		x.start=start;
		x.finish=start+times;
		x.in_num=i;
		in.push_back(x);
	}
	
	sort(in.begin(),in.end(),incmp);
	for(int i=1;i<=m;i++){
		minq.push(i);
	}
	for(int i=0;i<n;i++){
		if(print.empty()){
			in[i].print_num=minq.top();
			print.push(in[i]);
			minq.pop();
		}else{
			node x;
			if(minq.q.empty()){
				in[i].print_num=print.top().print_num;
				print.pop();
				print.push(in[i]);
			}else{
				//cout<<minq.top()<<" "<<print.top().finish<<" "<<in[i].start<<endl;
				while(!print.empty() && print.top().finish<=in[i].start){
					x=print.top();
					minq.push(x.print_num);
					print.pop();
				}
				in[i].print_num=minq.top();
				print.push(in[i]);
				minq.pop();
			}
		}
	}//print_in();
	for(int i=0;i<n;i++){
		out[in[i].print_num].push_back(in[i].in_num);
	}
	for(int i=1;i<=m;i++){
		sort(out[i].begin(),out[i].end());
		printf("%d",out[i].size());
		for(int j=0;j<out[i].size();j++){
			printf(" %d",out[i][j]);
		}
		printf("\n");
	}
	return 0;
}
2024/11/23 19:37
加载中...