Submission #448061

#TimeUsernameProblemLanguageResultExecution timeMemory
448061MohamedFaresNebiliJob Scheduling (CEOI12_jobs)C++14
0 / 100
1085 ms65540 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using ull = unsigned long long; using ld = long double; using db = double; using ii = pair<int, int>; using iii = pair<ii, int>; using pl = pair<ll, ll>; using ti = tuple<int, int, int>; using tll = tuple<ll, ll, ll>; using tld = tuple<ld, ld, ld>; using vi = vector<int>; using vl = vector<ll>; using vii = vector<ii>; using vpl = vector<pl>; using vc = vector<char>; using vs = vector<string>; #define mp make_pair #define pb push_back #define pf push_front #define pp pop_back #define ppf pop_front #define ff first #define ss second #define lb lower_bound #define ub upper_bound #define sz(v) ((int)v.size()) #define all(x) (x).begin() , (x).end() #define mt make_tuple #define FAST ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define parse(A, n) for ( ll K = 0; K < n; K++) { cin >> A[K]; } #define process(A, n) for( ll K = 1; K <= n; K++) { cin >> A[K]; } #define out(A, n) { for ( ll K = 0; K < n; K++) { cout <<(K!=0?" ":"")<<A[K]; } cout<<'\n'; } #define show(x) { bool first=true; for(auto& a:x) { if(first) { first=false; } else { cout<<" "; } cout<<a; } cout<<'\n'; } #define mem1(memo) memset(memo, -1, sizeof memo); #define mem0(memo) memset(memo, 0, sizeof(memo); #define print(k) printf("%.2lf\n", k) ld dist(ld x, ld y, ld a, ld b) { return sqrt((x-a)*(x-a) + (y-b)*(y-b)); } ll gcd(ll a , ll b){ return b ? gcd(b , a % b) : a ;} ll lcm(ll a , ll b){ return (a * b) / gcd(a , b);} ll fact(ll n) { return n > 1?(n * fact(n-1)):1;} void setIn(string s) { freopen(s.c_str(),"r",stdin); } void setOut(string s) { freopen(s.c_str(),"w",stdout); } void IO(string s = "") { if (sz(s)) { setIn(s+".in"), setOut(s+".out"); } } const int N = 100024; const int M = 1e6+24; const int inf = 1e9; const int MOD = 1e9+7; const int nx[4] = {0, 0, 1, -1}, ny[4] = {1, -1, 0, 0}; //East, West, South, North const int dr[8] = {1,1,0,-1,-1,-1, 0, 1}, dc[8] = {0,1,1, 1, 0,-1,-1,-1}; // S,SE,E,NE,N,NW,W,SW const long long INF = 1e18; const double EPS = 1e-9; const double PI = 3.14159265358979323846; /** |||||||||||||||||||||||||||||||| SOLUTION |||||||||||||||||||||||||||||||| **/ vl sol[N]; bool can(ll val, ll n, ll d, ll m, vl& a, vector<vl>& b) { vl s(n+2, 0); vl p[n+2], days[n+2]; for(ll l=1;l<=n;l++) { s[l]=s[l-1]+a[l]; for(auto u:b[l]) days[l].pb(u); } for(ll l=1;l<=n;l++) { ll diff=max(0LL, s[l]-val); ll k=s[l]/val; k+=(s[l]%val?1:0); if(k>d) return false; s[l+1]+=diff; for(ll i=0;i<val&&i<sz(days[l]); i++) p[l].pb(days[l][i]); for(ll i=val;i<sz(days[l]);i++) days[l+1].pb(days[l][i]); } for(ll l=1;l<=n;l++) sol[l]=p[l]; return true; } void solve() { /// JUST KEEP GOING ll n, d, m; cin>>n>>d>>m; vl a(n+1); vector<vl> b(n+2); for(ll l=0;l<m;l++) { ll k; cin>>k; b[k].pb(l+1); a[k]++; a[k+1]--; } ll lo=0, hi=LONG_LONG_MAX, ans; while(lo<=hi) { ll mid=(lo+hi)/2; if(can(mid, n, d, m, a,b)) { ans=mid; hi=mid-1; } else lo=mid+1; } cout<<ans<<'\n'; } int32_t main() { FAST; /// IO("outofplace"); int t; t=1; while(t--) { solve(); } return 0; } /*** Stuff you should look for : * int overflow, array bounds. * special cases (n=1?). * Observe The Constraints. * do smth instead of nothing and stay organized. * Reformulate The Problem Into Something More Theoretical. * Use flush operator when having TLE. * WRITE STUFF DOWN. * DON'T GET STUCK ON ONE APPROACH. Think of: * Brute force, Greedy(High->Low), Dynamic Programming, Divide and Conquer. * BFS, DFS, Flood Fill, Topological Sort, Bipartite Check, Articulation Points, SCC. * Minimum, Maximum Spanning Tree, SSSP, All-Pairs Shortest Paths, Network Flow. * Disjoint Set Union, Segment tree, Math, Two Pointers, Strings. Motivation : * Change Your Approach. * Don't Spend Too Much Time On The Problem: Move On! * If You Don't Fight You Cannot Win. ***/

Compilation message (stderr)

jobs.cpp: In function 'void setIn(std::string)':
jobs.cpp:48:31: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   48 | void setIn(string s) { freopen(s.c_str(),"r",stdin); }
      |                        ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
jobs.cpp: In function 'void setOut(std::string)':
jobs.cpp:49:32: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   49 | void setOut(string s) { freopen(s.c_str(),"w",stdout); }
      |                         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...