제출 #1040397

#제출 시각아이디문제언어결과실행 시간메모리
1040397Yang8on금 캐기 (IZhO14_divide)C++14
100 / 100
33 ms9684 KiB
#include <bits/stdc++.h>
#define Y8o "Divide and conquer"
#define maxn (int) 1e5 + 5
#define ll long long
#define pii pair<ll, ll>
#define gb(i, j) ((i >> j) & 1)
#define all(x) x.begin(), x.end()
#define _left id * 2, l, mid
#define _right id * 2 + 1, mid + 1, r

//#define f first
//#define s second

using namespace std;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll GetRandom(ll l, ll r) {
    return uniform_int_distribution<ll> (l, r) (rng);
}
void iof() {
    if(fopen(Y8o".in", "r"))
    {
        freopen(Y8o".in", "r", stdin);
        freopen(Y8o".out", "w", stdout);
    }
    ios_base::sync_with_stdio(0);
    cin.tie(NULL), cout.tie(NULL);
}
void ctime() {
    cerr << "\n" << "\nTime elapsed: " << 1000 * clock() / CLOCKS_PER_SEC << "ms\n";
}


int n;
struct dl { int td, g, e; } a[maxn];
ll se[maxn], sg[maxn], dp[maxn];

vector<ll> cur;
int rz(ll x) {
    return lower_bound( all(cur), x ) - cur.begin() + 1;
}

ll bit[2 * maxn];
void update(int x, ll val) {
    while(x) bit[x] = min(bit[x], val), x -= (x & -x);
}
ll get(int x, ll best = 1e18) {
    while(x < 2 * maxn) best = min(best, bit[x]), x += (x & -x);
    return best;
}

void solve()
{
    cin >> n;
    for(int i = 1; i <= n; i ++) {
        cin >> a[i].td >> a[i].g >> a[i].e;
        se[i] = se[i - 1] + a[i].e, sg[i] = sg[i - 1] + a[i].g;
    }

//    ll ans = 0;
//    for(int i = 1; i <= n; i ++) {
//        for(int j = i; j <= n; j ++) {
//            if(a[j].td - a[i].td <= se[j] - se[i - 1]) {
//                ans = max(ans, sg[j] - sg[i - 1]);
//            }
//        }
//    }

    for(int i = 1; i <= n; i ++) {
        cur.push_back(a[i].td - se[i]);
        cur.push_back(a[i].td - se[i - 1]);
    }

    sort( all(cur) );
    cur.resize( unique( all(cur) ) - cur.begin() );

    for(int i = 1; i < 2 * maxn; i ++) bit[i] = 1e18;
    for(int i = 1; i <= n; i ++) {
        update( rz(a[i].td - se[i - 1]), sg[i - 1] );
        dp[i] = sg[i] - get( rz(a[i].td - se[i]) );
    }

    cout << *max_element(dp + 1, dp + n + 1);
}


int main()
{
    iof();

    int nTest = 1;
//    cin >> nTest;

    while(nTest --) {
        solve();
    }

    ctime();
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

divide.cpp: In function 'void iof()':
divide.cpp:23:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   23 |         freopen(Y8o".in", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
divide.cpp:24:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   24 |         freopen(Y8o".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...