답안 #448179

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
448179 2021-07-29T06:46:08 Z MohamedFaresNebili Job Scheduling (CEOI12_jobs) C++14
95 / 100
414 ms 32944 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) {
      |                                 ~~~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 4296 KB Output is correct
2 Correct 32 ms 4228 KB Output is correct
3 Correct 34 ms 4252 KB Output is correct
4 Correct 33 ms 4296 KB Output is correct
5 Correct 33 ms 4228 KB Output is correct
6 Correct 34 ms 4236 KB Output is correct
7 Correct 33 ms 4232 KB Output is correct
8 Correct 33 ms 4296 KB Output is correct
9 Correct 43 ms 6092 KB Output is correct
10 Correct 45 ms 6232 KB Output is correct
11 Correct 41 ms 4164 KB Output is correct
12 Correct 85 ms 8132 KB Output is correct
13 Correct 125 ms 12800 KB Output is correct
14 Correct 176 ms 16580 KB Output is correct
15 Correct 214 ms 18112 KB Output is correct
16 Correct 260 ms 21956 KB Output is correct
17 Correct 322 ms 29420 KB Output is correct
18 Correct 346 ms 30404 KB Output is correct
19 Runtime error 414 ms 32944 KB Memory limit exceeded
20 Correct 313 ms 29428 KB Output is correct