제출 #1177831

#제출 시각아이디문제언어결과실행 시간메모리
1177831sergio_sakJob Scheduling (CEOI12_jobs)C++20
80 / 100
312 ms45536 KiB
#include <iostream> #include <algorithm> #include <utility> #include <vector> #include <bit> #include <set> #include <unordered_set> #include <map> #include <unordered_map> #include <stack> #include <queue> #include <deque> #include <string> #include <time.h> #include <random> #include <iomanip> #include <inttypes.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; template <class T> using Tree = tree<T, null_type, std::less<T>, rb_tree_tag, tree_order_statistics_node_update>; #pragma GCC target("avx,avx2,fma") #pragma GCC optimize("O3,Ofast") #define si(n) scanf("%lld", &n); #define sl(n) scanf("%lld", &n); #define sc(n) scanf("%c", &n); #define sf(n) scanf("%f", &n); #define slf(n) scanf("%lf", &n); #define fi first #define se second #define int long long #define pb push_back #define mp make_pair #define all(v) (v).begin(), (v).end() #define rall(v) (v).rbegin(), (v).rend() #define dbg(x) std::cerr << #x << ": " << x << std::endl; typedef std::set<int> si; typedef std::pair<int, int> pi; typedef std::vector<int> vi; typedef std::vector<std::vector<int>> dvi; typedef std::unordered_map<int , int> mi; const float EPS = 1e-9; const float PI = acos(-1); const int MAXN = 1000005; const int MOD = 1000000007; const int INF = INT64_MAX; int gcd(int a, int b) {return (b == 0) ? a : gcd(b, a%b);} int lcm(int a, int b) {return a/gcd(a, b) * b;} int N, D, M; std::pair<bool, dvi> isPossibel(const std::vector<pi> &jobs, int exMachina) { dvi schedule(N); int reqNum = 0; for(int i = 1; i <= N; ++i) { for(int j = 0; j < exMachina; ++j) { if(jobs[reqNum].fi > i) break; if(jobs[reqNum].fi + D >= i) schedule[i-1].pb(jobs[reqNum++].se); else return {false, schedule}; if(reqNum == M) return {true, schedule}; } } return {false, schedule}; } signed main() { std::ios::sync_with_stdio(0); std::cin.tie(0); std::cin>>N>>D>>M; std::vector<pi> jobs(M); for(int i = 0; i < M; ++i) { int num; std::cin>>num; jobs[i] = {num, i+1}; } std::sort(all(jobs)); dvi result; int low = 1, high = M, mid = 0; while(low < high) { mid = (high+low)/2; std::pair<bool, dvi> cur = isPossibel(jobs, mid); if(cur.fi) { high = mid; result = cur.se; } else { low = mid+1; } } std::cout<<low<<"\n"; for(int i = 0; i < N; ++i) { for(int &num : result[i]) std::cout<<num<<" "; std::cout<<0<<"\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...