使用双堆做法,样例全过,实际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",×,&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;
}