제출 #254824

#제출 시각아이디문제언어결과실행 시간메모리
254824karmaSalesman (IOI09_salesman)C++14
100 / 100
278 ms18672 KiB
#include<bits/stdc++.h> #define pb emplace_back #define ll long long #define Task "sales" using namespace std; template<typename T> inline void Cin(T &x) { char c; T sign = 1; x = 0; for (c = getchar(); c < '0' || c > '9'; c = getchar()) if (c == '-') sign = -1; for (; c >= '0' && c <= '9'; c = getchar()) x = x * 10 + c - '0'; x *= sign; } template <typename T> inline void Out(T x) {if(x > 9) Out(x / 10); putchar(x % 10 + '0');} template <typename T> inline void Cout(T x, char c) {if(x < 0) putchar('-'); x = abs(x); Out(x); putchar(c);} template <typename T, typename... Args> inline void Cin(T& a, Args&... args) {Cin(a);Cin(args...);} template <typename T, typename... Args> inline void Cout(T a, char c, Args... args) {Cout(a, c);Cout(args...);} const int N = int(5e5) + 7; const ll oo = (ll)1e15; struct TStore { int t, l, m; bool operator<(const TStore& o)const& {return t < o.t || (t == o.t && l < o.l);} } sl[N]; struct TBIT { vector<ll> t; int sz; void Init(int n) {sz = n, t.resize(n + 1); fill(t.begin(), t.end(), -oo);} void Update(int x, ll val) {for(; x <= sz; x += (x & -x)) t[x] = max(t[x], val);} ll Get(int x) {ll res = -oo; for(; x > 0; x -= (x & -x)) res = max(res, t[x]); return res;} } bit, rev; int n, s, MaxPos; ll u, d, ud, f, g, cost[N], sum, costl, costx; vector<ll> qu; int main() { ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0); if(fopen(Task".inp", "r")) { freopen(Task".inp", "r", stdin); freopen(Task".out", "w", stdout); } Cin(n, u, d, s); MaxPos = s; for(int i = 1; i <= n; ++i) { Cin(sl[i].t, sl[i].l, sl[i].m); MaxPos = max(MaxPos, sl[i].l); } sort(sl + 1, sl + n + 1); sl[n + 1].t = int(1e6); bit.Init(MaxPos), rev.Init(MaxPos); bit.Update(s, d * s), rev.Update(MaxPos - s + 1, -u * s); int j = 1; for(int i = 1; i <= n; ) { while(sl[i].t == sl[j].t && j <= n) ++j; if(i == j - 1) { f = max(bit.Get(sl[i].l) - d * sl[i].l, rev.Get(MaxPos - sl[i].l + 1) + u * sl[i].l) + sl[i].m; bit.Update(sl[i].l, f + d * sl[i].l), rev.Update(MaxPos - sl[i].l + 1, f - u * sl[i].l); } else { costl = costx = -oo; sum = 0; /// f(r) = max sum[r] - L[r] * d - sum[l - 1] + L[l] * d + cost[l] for(int k = i; k < j; ++k) { // x -> l -> r, l < r -> * d cost[k] = max(bit.Get(sl[k].l) - d * sl[k].l, rev.Get(MaxPos - sl[k].l + 1) + u * sl[k].l); costl = max(costl, sl[k].l * (d + u) - sum); sum += sl[k].m; costx = max(costx, costl + cost[k] - sl[k].l * u); f = costx - sl[k].l * d + sum; qu.pb(f); } costl = costx = -oo; sum = 0; for(int k = j - 1; k >= i; --k) { // x -> r -> l, l > r -> * u costl = max(costl, -sl[k].l * (u + d) - sum); sum += sl[k].m; costx = max(costx, cost[k] + costl + sl[k].l * d); f = costx + sl[k].l * u + sum; bit.Update(sl[k].l, f + d * sl[k].l), rev.Update(MaxPos - sl[k].l + 1, f - u * sl[k].l); bit.Update(sl[k].l, qu.back() + d * sl[k].l), rev.Update(MaxPos - sl[k].l + 1, qu.back() - u * sl[k].l); qu.pop_back(); } } i = j; } cout << max(max(bit.Get(s) - d * s, rev.Get(MaxPos - s + 1) + u * s), 0ll); }

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

salesman.cpp: In function 'int main()':
salesman.cpp:46:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
         freopen(Task".inp", "r", stdin);
         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
salesman.cpp:47:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
         freopen(Task".out", "w", stdout);
         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...