제출 #1277625

#제출 시각아이디문제언어결과실행 시간메모리
1277625random_nameJob Scheduling (CEOI12_jobs)C++20
90 / 100
197 ms18076 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main(){
	ll n,d,m; cin>>n>>d>>m;
	vector<vector<ll>> J(n);
	for(ll i=0;i<m;i++){
		ll a;cin>>a;
		J[a-1].push_back(i);
	}

	ll l=1,r=m;
	while(l<r){
		ll mid=(l+r)/2;
		bool able=true;
		queue<pair<ll, ll>> q;
		for(ll i=0;i<n;i++){
			q.push({i, J[i].size()});

			if(q.front().first + d < i){
				able = false;
				break;
			}
			
			ll diff = mid;
			while(!q.empty() && diff > 0){
				if(q.front().second <= diff){
					diff -= q.front().second;
					q.pop();
				}

				else{
					q.front().second -= diff;
					diff = 0;
				}
			}
		}

		if(q.size() != 0){
			able = false;
		}

		if(able){
			r = mid;
		}

		else
			l = mid+1;
	}

	cout << l << '\n';

	queue<pair<ll, ll>> q;
	for(ll i=0;i<n;i++){
		q.push({i, J[i].size()});
		
		ll diff = l;
		while(!q.empty() && diff > 0){
			if(q.front().second <= diff){
				diff -= q.front().second;
				for(int j=0;j<q.front().second;j++){
					cout << J[q.front().first].back()+1 << ' ';
					J[q.front().first].pop_back();
				}
				q.pop();
			}

			else{
				for(int j=0;j<diff;j++){
					cout << J[q.front().first].back()+1 << ' ';
					J[q.front().first].pop_back();
				}

				q.front().second -= diff;
				diff = 0;
			}
		}

		cout << 0 << '\n';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...