제출 #1309444

#제출 시각아이디문제언어결과실행 시간메모리
1309444zaki98Cloud Computing (CEOI18_clo)C++20
100 / 100
230 ms2152 KiB
#include "bits/stdc++.h"
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
typedef long long ll;
//#define int long long
#define F first
#define S second
#define PB push_back
#define MP make_pair
#define dbg cout << "dbg" << endl;
#define all(c) (c).begin(), (c).end()
#define pii pair<int,int>
#define pll pair<long long, long long>
#define sz(a) (int)a.size()
#define smin(x,y) x = min(x,y)
#define smax(x,y) x = max(x,y)
// permutation of the last layer
#define LOO(i,a,b) for (ll i = a; i <= b; i++)
#define OOL(i,a,b) for (ll i = b; i >= a; i--)
#define max3(a, b, c) max(max(a, b), c)
#define min3(a, b, c) min(min(a, b), c)
#define ld long double
#define YE cout << "YES\n"
#define NI cout << "NO\n"
#pragma GCC target("popcnt")
// #pragma GCC optimize("Ofast")
// #pragma GCC optimize("unroll-loops")
// #pragma GCC optimize("avx2")
using namespace std;
template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; }

template <typename SS>
ostream& operator<<(ostream& os,
                    const vector<SS>& vector) {
    os << "{";
    for (auto i : vector)
        os << i << ", ";
    cout << "}";
    return os;
}


typedef tree<int,null_type, less_equal<>,rb_tree_tag,tree_order_statistics_node_update> ordered_multiset;
typedef tree<int,null_type, less<>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;
ll constexpr MAX = 998244353;
void iO() {
    freopen("haircut.out", "w",stdout);
    freopen("haircut.in", "r",stdin);
}
vector<int> make_sorted_index(vector<ll> const &values) {
    vector<int> index(values.size());
    iota(index.begin(), index.end(), 0);
    stable_sort(index.begin(), index.end(), [&values](auto a, auto b) {
        return values[a] < values[b];
    });
    return index;
} // this function is so skibidi
vector<int> make_sorted_index(vector<int> const &values) {
    vector<int> index(values.size());
    iota(index.begin(), index.end(), 0);
    stable_sort(index.begin(), index.end(), [&values](auto a, auto b) {
        return values[a] < values[b];
    });
    return index;
} // this function is so skibidi
uint64_t splitmix(uint64_t x) {
    // http://xorshift.di.unimi.it/splitmix64.c
    x += 0x9e3779b97f4a7c15;
    x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
    x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
    return x ^ (x >> 31);
}

const uint64_t c1 = chrono::steady_clock::now().time_since_epoch().count();
const uint64_t c2 = splitmix(c1);
uint64_t mishmash(uint64_t a, uint64_t b) {
    return splitmix(c1*a+b + c2);
}
struct chash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }

    int operator()(pii x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();return splitmix64(FIXED_RANDOM * x.first + x.second + FIXED_RANDOM);
    }
}; // gp_hash_table custom hash so skibidi
std::random_device dev;
std::mt19937 rng(dev());
struct BIT {
    vector<ll> bit;  // binary indexed tree
    int n;
    BIT(int n) {
        this->n = n;
        bit.assign(n, 0);
    }
    BIT(int n, vector<int> vec) {
        this->n = n;
        bit.assign(n, 0);
        LOO(i,0,n-1) add(i, vec[i]);
    }

    ll s(int r) {
        ll ret = 0;
        for (; r >= 0; r = (r & (r + 1)) - 1)
            ret += bit[r];
        return ret;
    }
    void add(int idx, ll delta) {
        for (; idx < n; idx = idx | (idx + 1))
            bit[idx] = (bit[idx]+delta)%MAX;
    }
    ll sum(int l, int r) {
        if (l>r) return 0;
        return (s(r)-(l==0 ? 0 : s(l-1)))%MAX;
    }
};
ll arith(ll n, ll step, ll a0) {
    ll prog = ((n)*(n-1)/2)%MAX;
    prog= step*prog%MAX;
    ll answ = (a0*n)%MAX + prog;
    return answ%MAX;
}
ll iSqrt(ll n) {
    if (n==0) return 0;
    ll lo = 1, hi = min((ll)1414213562, n); // long long
    ll res = 1;
    while(lo <= hi) {
        ll mid = lo + (hi - lo)/2;
        if(mid*mid <= n) {
            res = mid;
            lo = mid + 1;
        }
        else {
            hi = mid - 1;
        }
    }
    return res;
}
ll invmod(ll b) {
    b%=MAX;
    ll curr = 1; ll mt = b;
    ll exp = MAX-2;
    while (exp) {
        if (exp&1) curr=(curr*mt)%MAX;
        mt=mt*mt%MAX;
        exp>>=1;
    }
    return curr;
}
ll invmod(ll k, ll p)
{
    k %= p;
    if (k < 0) k += p;
    int neg = 1;
    ll p1 = 1, p2 = 0, k1 = k, m1 = p, q, r, temp;
    while(k1 > 0) {
        q = m1 / k1;
        r = m1 % k1;
        temp = q*p1 + p2;
        p2 = p1;
        p1 = temp;
        m1 = k1;
        k1 = r;
        neg = !neg;
    }
    return neg ? p - p2 : p2;
}
ll binpow(ll b, ll exp) {
    ll curr = 1; ll mt = b;
    while (exp) {
        if (exp&1) curr=(curr*mt)%MAX;
        mt=mt*mt%MAX;
        exp>>=1;
    }
    return curr;
}
ll binpow(ll b, ll exp, ll p) {
    ll curr = 1; ll mt = b;
    while (exp) {
        if (exp&1) curr=(curr*mt)%p;
        mt=mt*mt%p;
        exp>>=1;
    }
    return curr;
}
vector<int> LIS(vector<ll> const& a) {
    int n = a.size();
    const int INF = 1e9;
    vector<int> d(n+1, INF);
    vector<int> parent(n+1), ind(n+1);
    d[0] = -INF;
    ind[0]=-1;
    parent[0]=-1;
    for (int i = 0; i < n; i++) {
        int l = upper_bound(d.begin(), d.end(), a[i]) - d.begin();
        if (d[l-1] < a[i] && a[i] < d[l]) {
            d[l] = a[i];
            ind[l]=i;
            parent[i]=ind[l-1];
        }
    }
    int lastind = -1;
    for (int l = 0; l <= n; l++) {
        if (d[l] < INF) {
            lastind=l;
        }
    }
    lastind=ind[lastind];
    vector<int> ans={lastind};
    while (lastind!=-1) {
        if (parent[lastind]!=-1) ans.PB(parent[lastind]);
        lastind=parent[lastind];
    }
    reverse(all(ans));
    return ans;
}
ll dp[1'000'01];
ll dp2[1'000'01];
void solve(){
   int n;
    cin>>n;
    // freq, cores, price
    vector<pair<ll, pll>> cool(n);
    LOO(i,0,n-1) {
        cin>>cool[i].S.F;
        cin>>cool[i].F;
        cin>>cool[i].S.S;
        cool[i].S.F=-cool[i].S.F;
        cool[i].S.S=-cool[i].S.S;
        cool[i].F=-cool[i].F;
    }
    int m;
    cin>>m;
    cool.resize(n+m);
    LOO(i,n,n+m-1) {
        cin>>cool[i].S.F;
        cin>>cool[i].F;
        cin>>cool[i].S.S;
        cool[i].F=-cool[i].F;
    }

    n+=m;
    sort(all(cool));
    vector<pii> actual(n);
    LOO(i,0,n-1) {
        actual[i]=cool[i].S;
        actual[i].F=-actual[i].F;
    }
    LOO(i,0,1e5) {
        dp[i]=-1e18;
        dp2[i]=0;
    }
    dp[0]=dp2[0]=0;
    LOO(ind,0,n/2) {
        if (actual[ind].F>=0) {
            OOL(i,max(-actual[ind].F,0), min(1'000'00-actual[ind].F,1'000'00)) {
                smax(dp[i+actual[ind].F], dp[i]+actual[ind].S);
            }
        }
        else {
            LOO(i,max(-actual[ind].F,0), min(1'000'00-actual[ind].F,1'000'00)) {
                smax(dp[i+actual[ind].F], dp[i]+actual[ind].S);
            }
        }
    }
    OOL(ind,n/2+1, n-1) {
        actual[ind].F=-actual[ind].F;
        if (actual[ind].F>=0) {
            OOL(i,max(-actual[ind].F,0), min(1'000'00-actual[ind].F,1'000'00)) {
                smax(dp2[i+actual[ind].F], dp2[i]+actual[ind].S);
            }
        }
        else {
            LOO(i,max(-actual[ind].F,0), min(1'000'00-actual[ind].F,1'000'00)) {
                smax(dp2[i+actual[ind].F], dp2[i]+actual[ind].S);
            }
        }
    }
    OOL(i,0,1'000'00-1) smax(dp[i],dp[i+1]);
    ll best=0;
    LOO(i,0,1'000'00) {
        smax(best,dp[i]+dp2[i]);
    }
    cout << best << '\n';
}


signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
   // iO();
   int t = 1;
  //  cin >> t;
    while (t--) {
        solve();
        //cout << flush;
    }
    return 0;
}

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

clo.cpp: In function 'void iO()':
clo.cpp:48:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   48 |     freopen("haircut.out", "w",stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
clo.cpp:49:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   49 |     freopen("haircut.in", "r",stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...