Submission #1359587

#TimeUsernameProblemLanguageResultExecution timeMemory
1359587PakinDioxideTeleporter 2 (JOI26_teleporter)C++17
100 / 100
1821 ms11860 KiB
#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <chrono>
#include <cmath>
#include <complex>
#include <cstring>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <vector>
#include <climits>

using namespace std;

using ll = long long;
using db = long double;
using str = string;

using pi = pair <int, int>;
using pl = pair <ll, ll>;
using pd = pair <db, db>;
#define mp make_pair
#define ff first
#define ss second

template <class T> using V = vector <T>;
using vi = V <int>;
using vb = V <bool>;
using vl = V <ll>;
using vd = V <db>;
using vs = V <str>;
using vpi = V <pi>;
using vpl = V <pl>;
using vpd = V <pd>;
template <class T> using PQ = priority_queue <T>;

#define sz(x) (int) size(x)
#define bg(x) begin(x)
#define all(x) bg(x), end(x)
#define rall(x) rbegin(x), rend(x)
#define srt(x) sort(all(x))
#define rsz resize
#define ins insert
#define pb push_back
#define emb emplace_back
#define em emplace
#define ft front()
#define bk back()

#define lb lower_bound
#define ub upper_bound

#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define F0R(i, a) FOR(i, 0, a-1)
#define ROF(i, a, b) for (int i = (b); i >= (a); i--)
#define R0F(i, a) ROF(i, 0, a-1)
#define each(e, x) for (auto &e : x)

ll cdiv(ll a, ll b) { return ceil((db) a / b); }
ll fdiv(ll a, ll b) { return floor((db) a / b); }
template <class T> bool ckmin(T &a, const T &b) {
    return b < a ? a = b, 1 : 0;
}
template <class T> bool ckmax(T &a, const T &b) {
    return b > a ? a = b, 1 : 0;
}

template <typename T, typename = void>
struct is_iterable : false_type {};

template <typename T>
struct is_iterable<T, void_t<decltype(begin(declval<T>())), decltype(end(declval<T>()))>> : true_type {};

void err(string name) {}
template <typename T, typename... Args>
void err(string name, T val, Args... args) {
    size_t pos = name.find(',');
    string first = (pos == string::npos) ? name : name.substr(0, pos);
    string rest = (pos == string::npos) ? "" : name.substr(pos + 2);

    cout << first << " = "; 
    
    if constexpr (is_iterable<T>::value && !is_same_v<T, string>) {
        cout << "{";
        bool fst = true;
        for (auto const& x : val) {
            if (!fst) cout << ", ";
            cout << x;
            fst = false;
        }
        cout << "}";
    } else {
        cout << val;
    }

    if (rest != "") {
        cout << " | ";
        err(rest, args...);
    } else {
        cout << '\n';
    }
}

#ifdef LOCAL
#define dbg(...) cout << "[" << __FUNCTION__ << ":" << __LINE__ << "] ", err(#__VA_ARGS__, __VA_ARGS__)
#else
#define dbg(...) 67
#endif

void setIO(string name = "") {
    ios::sync_with_stdio(0), cin.tie(0);
    if (sz(name)) {
        freopen((name + ".in").c_str(), "r", stdin);
        freopen((name + ".out").c_str(), "w", stdout);
    }
}

const ll INF = 1e18;
const pi d[4] = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
mt19937 rng((uint32_t)chrono::steady_clock::now().time_since_epoch().count()); 
const int mod = 998244353; // 1e9+7;
const int mxN = 1e5+5;

struct SEG {
    pl seg[4*mxN];
    ll lz[4*mxN];

    void build(int l, int r, int u) {
        if (l == r) seg[u] = mp(0, 0), lz[u] = 0;
        else {
            int m = l + (r-l)/2;
            build(l, m, u<<1);
            build(m+1, r, u<<1|1);
            seg[u] = mp(0, 0), lz[u] = 0;
        }
    }

    void push(int u) {
        seg[u<<1].ff += lz[u];
        seg[u<<1|1].ff += lz[u];
        lz[u<<1] += lz[u];
        lz[u<<1|1] += lz[u];
        lz[u] = 0;
    }

    void upd(int l, int r, int x, int y, pl k, int u) {
        if (r < x || l > y) return;
        else if (x <= l && r <= y) seg[u].ff += k.ff, seg[u].ss += k.ss, lz[u] += k.ff;
        else {
            push(u);
            int m = l + (r-l)/2;
            upd(l, m, x, y, k, u<<1);
            upd(m+1, r, x, y, k, u<<1|1);
            seg[u] = min(seg[u<<1], seg[u<<1|1]);
        }
    }

    pl qr(int l, int r, int x, int y, int u) {
        if (r < x || l > y) return mp(INF, INF);
        if (x <= l && r <= y) return seg[u];
        else {
            push(u);
            int m = l + (r-l)/2;
            return min(qr(l, m, x, y, u<<1), qr(m+1, r, x, y, u<<1|1));
        }
    }
} T;

int main() {
    setIO();
    int n, m, k; cin >> n >> m >> k;
    V <tuple <int, int, ll>> v(m);
    for (auto &[r, l, c] : v) cin >> l >> r >> c;
    srt(v);
    auto calc = [&] (ll ld) {
        T.build(0, n+1, 1);
        pl dp[n+2];
        dp[0] = mp(0, 0);
        int it = 0;
        for (int i = 1; i <= n+1; i++) {
            while (it < m && get<0>(v[it]) < i) {
                T.upd(0, n+1, 0, get<1>(v[it]), mp(get<2>(v[it]), 0), 1);
                it++;
            }
            dp[i] = T.qr(0, n+1, 0, i-1, 1);
            dp[i].ff += ld, dp[i].ss++;
            T.upd(0, n+1, i, i, dp[i], 1);
            if (ld == 8) dbg(i, dp[i].ff, dp[i].ss);
        }
        return dp[n+1];
    };
    ll L = 0, R = 1e14, ans = 0;
    while (L <= R) {
        ll m = L + (R-L)/2;
        pl x = calc(m);
        if (x.ss-1 <= k) ans = m, R = m-1;
        else L = m+1;
    }
    dbg(ans);
    pl val = calc(ans);
    dbg(val.ff, val.ss);
    cout << val.ff - val.ss * ans - (k - (val.ss - 1)) * ans << '\n';
}










Compilation message (stderr)

Main.cpp: In function 'void setIO(std::string)':
Main.cpp:120:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  120 |         freopen((name + ".in").c_str(), "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:121:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  121 |         freopen((name + ".out").c_str(), "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...