답안 #520841

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
520841 2022-01-31T07:00:08 Z SmolBrain 구경하기 (JOI13_watching) C++17
100 / 100
408 ms 31828 KB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

typedef long long int ll;
typedef long double ld;

#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL)
#define endl '\n'
#define pb push_back
#define conts continue
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define yes cout << "YES" << endl
#define no cout << "NO" << endl
#define ff first
#define ss second
#define ceil2(x,y) ((x+y-1) / (y))
#define sz(a) a.size()
#define setbits(x) __builtin_popcountll(x)
#ifndef ONLINE_JUDGE
#define debug(x) cout << #x <<" = "; print(x); cout << endl
#else
#define debug(x)
#endif

#define rep(i,n) for(int i = 0; i < n; ++i)
#define rep1(i,n) for(int i = 1; i <= n; ++i)
#define trav(i,a) for(auto &i : a)

bool iseven(ll n) {if ((n & 1) == 0) return true; return false;}

void print(ll t) {cout << t;}
void print(int t) {cout << t;}
void print(string t) {cout << t;}
void print(char t) {cout << t;}
void print(double t) {cout << t;}
void print(ld t) {cout << t;}

template <class T, class V> void print(pair <T, V> p);
template <class T> void print(vector <T> v);
template <class T> void print(set <T> v);
template <class T, class V> void print(map <T, V> v);
template <class T> void print(multiset <T> v);
template <class T, class V> void print(pair <T, V> p) {cout << "{"; print(p.ff); cout << ","; print(p.ss); cout << "}";}
template <class T> void print(vector <T> v) {cout << "[ "; for (T i : v) {print(i); cout << " ";} cout << "]";}
template <class T> void print(set <T> v) {cout << "[ "; for (T i : v) {print(i); cout << " ";} cout << "]";}
template <class T> void print(multiset <T> v) {cout << "[ "; for (T i : v) {print(i); cout << " ";} cout << "]";}
template <class T, class V> void print(map <T, V> v) {cout << "[ "; for (auto i : v) {print(i); cout << " ";} cout << "]";}

void usaco(string filename) {
    freopen((filename + ".in").c_str(), "r", stdin);
    freopen((filename + ".out").c_str(), "w", stdout);
}

const int MOD = 1e9 + 7;
const int maxn = 1e5 + 5;
const int inf1 = 1e9 + 5;
const ll inf2 = ll(1e18) + 5;

ll dp[2005][2005];

void solve(int test_case)
{
    // referred to this: https://github.com/SpeedOfMagic/CompetitiveProgramming/blob/master/JOIOC/13-watching.cpp
    ll n, p, q; cin >> n >> p >> q;
    vector<ll> a(n + 5);
    rep1(i, n) cin >> a[i];

    if(p + q >= n){
        cout << 1 << endl;
        return;
    }

    sort(a.begin() + 1, a.begin() + n + 1);

    auto check = [&](ll k) {
        // dp[i][j] = min no.of large cameras required to cover all events from [1..i] using j small cameras
        // large[i] = right most position for which a[pos] < a[i] - (2 * k) + 1
        // small[i] = right most position for which a[pos] < a[i] - k + 1

        rep(i, n + 5) rep(j, p + 5) dp[i][j] = inf2;
        vector<ll> large(n + 5), small(n + 5);
        rep1(i, n) {
            auto it = lower_bound(a.begin() + 1, a.begin() + n + 1, a[i] - (2 * k) + 1);
            ll pos = max(ll(it - a.begin() - 1), 0ll);
            large[i] = pos;
        }

        rep1(i, n) {
            auto it = lower_bound(a.begin() + 1, a.begin() + n + 1, a[i] - k + 1);
            ll pos = max(ll(it - a.begin() - 1), 0ll);
            small[i] = pos;
        }

        dp[0][0] = 0;

        rep1(i, n) {
            rep(j, p + 1) {
                // place large cam
                ll pos1 = large[i];
                dp[i][j] = min(dp[i][j], dp[pos1][j] + 1);

                // place small cam
                if (j) {
                    ll pos2 = small[i];
                    dp[i][j] = min(dp[i][j], dp[pos2][j - 1]);
                }
            }
        }

        rep(j, p + 1) {
            if (dp[n][j] <= q) {
                return true;
            }
        }

        return false;
    };

    ll l = 1, r = inf1;
    ll ans = inf2;

    while (l <= r) {
        ll mid = (l + r) / 2;
        if (check(mid)) {
            ans = min(ans, mid);
            r = mid - 1;
        }
        else {
            l = mid + 1;
        }
    }

    cout << ans << endl;
}

int main()
{
    fastio;

    int t = 1;
    // cin >> t;
    rep1(i, t) {
        solve(i);
    }

    return 0;
}

Compilation message

watching.cpp: In function 'void usaco(std::string)':
watching.cpp:56:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   56 |     freopen((filename + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
watching.cpp:57:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   57 |     freopen((filename + ".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 716 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
3 Correct 0 ms 332 KB Output is correct
4 Correct 1 ms 204 KB Output is correct
5 Correct 0 ms 204 KB Output is correct
6 Correct 0 ms 204 KB Output is correct
7 Correct 1 ms 704 KB Output is correct
8 Correct 1 ms 712 KB Output is correct
9 Correct 1 ms 716 KB Output is correct
10 Correct 1 ms 716 KB Output is correct
11 Correct 1 ms 700 KB Output is correct
12 Correct 1 ms 716 KB Output is correct
13 Correct 1 ms 716 KB Output is correct
14 Correct 1 ms 716 KB Output is correct
15 Correct 1 ms 716 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 8524 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 1 ms 332 KB Output is correct
5 Correct 1 ms 332 KB Output is correct
6 Correct 1 ms 332 KB Output is correct
7 Correct 13 ms 8744 KB Output is correct
8 Correct 33 ms 10444 KB Output is correct
9 Correct 200 ms 20304 KB Output is correct
10 Correct 408 ms 31828 KB Output is correct
11 Correct 26 ms 9908 KB Output is correct
12 Correct 224 ms 23860 KB Output is correct
13 Correct 14 ms 8736 KB Output is correct
14 Correct 21 ms 8780 KB Output is correct
15 Correct 13 ms 8780 KB Output is correct