Submission #448180

# Submission time Handle Problem Language Result Execution time Memory
448180 2021-07-29T06:47:01 Z MohamedFaresNebili Job Scheduling (CEOI12_jobs) C++14
95 / 100
403 ms 33476 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 = 124;
const int M = 1e5+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 |||||||||||||||||||||||||||||||| **/

ll n, d, m;
bool can(ll val, vpl& t)
{
    ll p[val]{0}, md=0LL;
    for(ll l=0, curr=0;l<m;l++, curr=(curr+1)%val) {
        if(p[curr]+1>t[l].ff)
            md=max(md, p[curr]+1-t[l].ff);
        p[curr]=max(p[curr]+1, t[l].ff);
    }
    return md<=d;
}

void solve()
{
    /// JUST KEEP GOING
    cin>>n>>d>>m; vpl t(m);
    for(ll l=0;l<m;l++) {
        ll k; cin>>k; t[l].ff=k; t[l].ss=l+1LL;
    }
    sort(all(t)); ll lo=0, hi=m, ans;
    while(lo<hi) {
        ll mid=(lo+hi)/2;
        if(can(mid, t)) { ans=mid; hi=mid; }
        else lo=mid+1;
    }
    cout<<ans<<'\n';
    vl sol[n*2]; ll p[ans]{0};
    for(ll l=0, curr=0;l<m;l++, curr=(curr+1)%ans) {
        p[curr]=max(p[curr]+1, t[l].ff);
        sol[p[curr]].pb(t[l].ss);
    }
    for(ll l=1;l<=n;l++) {
        for(auto u:sol[l]) cout<<u<<" ";
        cout<<"0\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); }
      |                         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
jobs.cpp: In function 'void solve()':
jobs.cpp:91:37: warning: 'ans' may be used uninitialized in this function [-Wmaybe-uninitialized]
   91 |     for(ll l=0, curr=0;l<m;l++, curr=(curr+1)%ans) {
      |                                 ~~~~^~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 33 ms 4188 KB Output is correct
2 Correct 34 ms 4196 KB Output is correct
3 Correct 33 ms 4196 KB Output is correct
4 Correct 33 ms 4280 KB Output is correct
5 Correct 33 ms 4224 KB Output is correct
6 Correct 33 ms 4168 KB Output is correct
7 Correct 33 ms 4192 KB Output is correct
8 Correct 34 ms 4188 KB Output is correct
9 Correct 45 ms 8260 KB Output is correct
10 Correct 46 ms 8280 KB Output is correct
11 Correct 42 ms 3796 KB Output is correct
12 Correct 85 ms 7528 KB Output is correct
13 Correct 126 ms 12208 KB Output is correct
14 Correct 175 ms 15920 KB Output is correct
15 Correct 209 ms 17476 KB Output is correct
16 Correct 261 ms 21316 KB Output is correct
17 Correct 310 ms 28708 KB Output is correct
18 Correct 348 ms 29640 KB Output is correct
19 Runtime error 403 ms 33476 KB Memory limit exceeded
20 Correct 313 ms 28808 KB Output is correct