Submission #448061

# Submission time Handle Problem Language Result Execution time Memory
448061 2021-07-28T16:58:31 Z MohamedFaresNebili Job Scheduling (CEOI12_jobs) C++14
0 / 100
1000 ms 65540 KB
#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

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 time Memory Grader output
1 Incorrect 122 ms 7788 KB Output isn't correct
2 Incorrect 118 ms 7716 KB Output isn't correct
3 Incorrect 123 ms 7744 KB Output isn't correct
4 Incorrect 121 ms 7700 KB Output isn't correct
5 Incorrect 117 ms 7776 KB Output isn't correct
6 Incorrect 122 ms 7940 KB Output isn't correct
7 Incorrect 119 ms 7768 KB Output isn't correct
8 Incorrect 150 ms 7716 KB Output isn't correct
9 Incorrect 195 ms 15164 KB Output isn't correct
10 Incorrect 206 ms 16180 KB Output isn't correct
11 Incorrect 148 ms 10900 KB Unexpected end of file - int32 expected
12 Runtime error 277 ms 65540 KB Execution killed with signal 9
13 Incorrect 350 ms 29248 KB Unexpected end of file - int32 expected
14 Runtime error 653 ms 65540 KB Execution killed with signal 9
15 Incorrect 463 ms 22432 KB Output isn't correct
16 Execution timed out 1036 ms 31728 KB Time limit exceeded
17 Execution timed out 1085 ms 36168 KB Time limit exceeded
18 Runtime error 742 ms 65540 KB Execution killed with signal 9
19 Runtime error 936 ms 64328 KB Memory limit exceeded
20 Execution timed out 1083 ms 36052 KB Time limit exceeded