답안 #448085

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
448085 2021-07-28T18:41:22 Z MohamedFaresNebili Job Scheduling (CEOI12_jobs) C++14
95 / 100
338 ms 34748 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 maxd=0, endT[val]={0};
    for(ll l=0, curr=0;l<m;l++, curr++) {
        if(curr==val) curr=0;
        if(endT[curr]+1>t[l].ff) {
            endT[curr]++;
            maxd=max(maxd, endT[curr]-t[l].ff);
        }
        else endT[curr]=t[l].ff;
    }
    return maxd<=d;
}

void solve()
{
    /// JUST KEEP GOING
    cin>>n>>d>>m; vpl t(m);
    for(ll l=0;l<m;l++) {
        cin>>t[l].ff; t[l].ss=l+1;
    }
    sort(all(t)); ll lo=0, hi=m; ll ans=LONG_LONG_MAX;
    while(lo<hi) {
        ll mid=(lo+hi)/2;
        if(can(mid, t)) { hi=mid; ans=mid; }
        else lo=mid+1;
    }
    cout<<ans<<'\n';

    vl sol[M]; ll endT[ans]{0};
    for(ll l=0, curr=0;l<m;l++, curr++) {
        if(curr==ans) curr=0;
        endT[curr]=max(t[l].ff, endT[curr]+1);
        sol[endT[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); }
      |                         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 28 ms 6088 KB Output is correct
2 Correct 28 ms 6156 KB Output is correct
3 Correct 33 ms 6088 KB Output is correct
4 Correct 28 ms 6164 KB Output is correct
5 Correct 27 ms 6096 KB Output is correct
6 Correct 27 ms 6156 KB Output is correct
7 Correct 28 ms 6032 KB Output is correct
8 Correct 30 ms 6148 KB Output is correct
9 Correct 38 ms 6280 KB Output is correct
10 Correct 38 ms 6340 KB Output is correct
11 Correct 40 ms 6168 KB Output is correct
12 Correct 70 ms 9784 KB Output is correct
13 Correct 103 ms 14532 KB Output is correct
14 Correct 144 ms 18276 KB Output is correct
15 Correct 182 ms 19964 KB Output is correct
16 Correct 233 ms 23664 KB Output is correct
17 Correct 260 ms 31148 KB Output is correct
18 Correct 282 ms 31940 KB Output is correct
19 Runtime error 338 ms 34748 KB Memory limit exceeded
20 Correct 255 ms 31144 KB Output is correct