제출 #52752

#제출 시각아이디문제언어결과실행 시간메모리
52752aquablitz11Salesman (IOI09_salesman)C++14
62 / 100
939 ms38944 KiB
// headers //#pragma GCC optimize("Ofast") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #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; // types template<class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; using dbl = double; using ll = long long; using ull = unsigned long long; using pii = pair<int, int>; using pll = pair<ll, ll>; using pli = pair<ll, int>; using piipi = pair<pii, int>; using pipii = pair<int, pii>; using plpii = pair<ll, pii>; using ppii = pair<pii, pii>; // loops #define forx(i, x, y) for (int i = (x); i <= (y); ++i) #define forn(i, n) for (int i = 0; i < (n); ++i) #define for1(i, n) for (int i = 1; i <= (n); ++i) #define rofx(i, x, y) for (int i = x; i >= y; --i) #define rofn(i, n) for (int i = n-1; i >= 0; --i) #define rof1(i, n) for (int i = n; i >= 1; --i) #define fora(x, v) for (auto x : v) // define shortcuts #define all(x) begin(x), end(x) #define pb push_back #define eb emplace_back #define F first #define S second #define X first #define Y second #define MP make_pair #define MT make_tuple // functions template<class T> inline bool hasbit(T x, int i) { return x&(1<<i); } template<class T> inline T togbit(T x, int i) { return x|(1<<i); } template<class T> inline T setbit(T x, int i) { return x|(1<<i); } template<class T> inline T rembit(T x, int i) { return x&~(1<<i); } template<class T> inline bool setmax(T &a, const T &b) { return b > a ? a = b, true : false; } template<class T> inline bool setmin(T &a, const T &b) { return b < a ? a = b, true : false; } template<class T> int compress(vector<T> &v) { sort(all(v)); v.resize(unique(all(v))-v.begin()); return v.size(); } // read functions int read_int() { int x; scanf("%d", &x); return x; } ll read_ll() { ll x; scanf("%" SCNd64, &x); return x; } ull read_ull() { ull x; scanf("%" SCNu64, &x); return x; } dbl read_dbl() { dbl x; scanf("%lf", &x); return x; } void _R(int &x) { x = read_int(); } void _R(ll &x) { x = read_ll(); } void _R(dbl &x) { x = read_dbl(); } void R() {} template<class T, class... U> void R(T &head, U &... tail) { _R(head); R(tail...); } // print functions template<class T> void _W(const T &x) { cout << x; } void _W(const int &x) { printf("%d", x); } void _W(const ll &x) { printf("%" PRId64, x); } void _W(const ull &x) { printf("%" PRIu64, x); } void _W(const double &x) { printf("%.16f", x); } void _W(const char &x) { putchar(x); } void _W(const char *x) { printf("%s", x); } template<class T> void _W(const vector<T> &x) { for (auto i = x.begin(); i != x.end(); _W(*i++)) if (i != x.cbegin()) putchar(' '); } void W() {} template<class T, class... U> void W(const T &head, const U &... tail) { _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); } // pseudo-random number generator template<class T, T x1, T x2, T x3, int y1, int y2, int y3> struct PRNG { using S = typename make_signed<T>::type; T s; PRNG(T _s = 0) : s(_s) {} T next() { T z = (s += x1); z = (z ^ (z >> y1)) * x2; z = (z ^ (z >> y2)) * x3; return z ^ (z >> y3); } T next(T n) { return next() % n; } S next(S l, S r) { return l + next(r - l + 1); } T operator()() { return next(); } T operator()(T n) { return next(n); } S operator()(S l, S r) { return next(l, r); } static T gen(T s) { return PRNG(s)(); } template<class U> void shuffle(U first, U last) { size_t n = last - first; for (size_t i = 0; i < n; i++) swap(first[i], first[next(i + 1)]); } }; PRNG<uint32_t, 0x9E3779B1, 0x85EBCA6B, 0xC2B2AE35, 16, 13, 16> r32; PRNG<uint64_t, 0x9E3779B97F4A7C15, 0xBF58476D1CE4E5B9, 0x94D049BB133111EB, 30, 27, 31> r64; // program int _main(); int main() { //ios::sync_with_stdio(false), cin.tie(0); //time_t begin = clock(); int ret = _main(); //time_t end = clock(); //fprintf(stderr, "Program took %.3f seconds to compute\n", ((double)end-begin)/CLOCKS_PER_SEC); return ret; } /************************************************************ CODE STARTS BELOW THIS POINT ************************************************************/ const int N = 1<<19; const int INF = 2e9; vector<pii> fair[N]; int t1[N<<1], t2[N<<1], dp[N]; int query(int t[], int l, int r) { int ans = -INF; for (l += N, r += N+1; l < r; l >>= 1, r >>= 1) { if (l&1) setmax(ans, t[l++]); if (r&1) setmax(ans, t[--r]); } return ans; } void update(int t[], int p, int x) { for (t[p += N] = x; p > 1; p >>= 1) t[p>>1] = max(t[p], t[p^1]); } int _main() { int n, u, d, s; R(n, u, d, s); forn(i, n) { int t, l, m; R(t, l, m); fair[t].eb(l, m); } fair[N-1].eb(s, 0); forn(i, N) { dp[i] = i == s ? 0 : -INF; update(t1, i, dp[i] - (N-i)*d); update(t2, i, dp[i] - i*u); } forn(t, N) { sort(all(fair[t])); int val = -INF; forn(i, fair[t].size()) { int l = fair[t][i].F, m = fair[t][i].S; int q1 = max(val, query(t1, 0, l)) + (N-l)*d; int q2 = query(t2, l, N-1) + l*u; dp[l] = max(q1, q2) + m; setmax(val, dp[l] - (N-l)*d); } val = -INF; rofn(i, fair[t].size()) { int l = fair[t][i].F, m = fair[t][i].S; int q1 = query(t1, 0, l) + (N-l)*d; int q2 = max(val, query(t2, l, N-1)) + l*u; dp[l] = max(q1, q2) + m; setmax(val, dp[l] - l*u); } forn(i, fair[t].size()) { int l = fair[t][i].F; update(t1, l, dp[l] - (N-l)*d); update(t2, l, dp[l] - l*u); } } W(dp[s]); return 0; }

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

salesman.cpp: In function 'll read_ll()':
salesman.cpp:49:42: warning: format '%ld' expects argument of type 'long int*', but argument 2 has type 'll* {aka long long int*}' [-Wformat=]
 ll read_ll() { ll x; scanf("%" SCNd64, &x); return x; }
                                        ~~^
salesman.cpp: In function 'ull read_ull()':
salesman.cpp:50:45: warning: format '%lu' expects argument of type 'long unsigned int*', but argument 2 has type 'ull* {aka long long unsigned int*}' [-Wformat=]
 ull read_ull() { ull x; scanf("%" SCNu64, &x); return x; }
                                           ~~^
salesman.cpp: In function 'void _W(const ll&)':
salesman.cpp:60:44: warning: format '%ld' expects argument of type 'long int', but argument 2 has type 'll {aka long long int}' [-Wformat=]
 void _W(const ll &x) { printf("%" PRId64, x); }
                                           ~^
salesman.cpp: In function 'void _W(const ull&)':
salesman.cpp:61:45: warning: format '%lu' expects argument of type 'long unsigned int', but argument 2 has type 'ull {aka long long unsigned int}' [-Wformat=]
 void _W(const ull &x) { printf("%" PRIu64, x); }
                                            ~^
salesman.cpp: In function 'int _main()':
salesman.cpp:23:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define forn(i, n) for (int i = 0; i < (n); ++i)
                                      ^
salesman.cpp:150:9: note: in expansion of macro 'forn'
         forn(i, fair[t].size()) {
         ^~~~
salesman.cpp:23:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define forn(i, n) for (int i = 0; i < (n); ++i)
                                      ^
salesman.cpp:165:9: note: in expansion of macro 'forn'
         forn(i, fair[t].size()) {
         ^~~~
salesman.cpp: In function 'int read_int()':
salesman.cpp:48:30: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
 int read_int() { int x; scanf("%d", &x); return x; }
                         ~~~~~^~~~~~~~~~
salesman.cpp: In function 'll read_ll()':
salesman.cpp:49:27: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
 ll read_ll() { ll x; scanf("%" SCNd64, &x); return x; }
                      ~~~~~^~~~~~~~~~~~~~~~
salesman.cpp: In function 'ull read_ull()':
salesman.cpp:50:30: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
 ull read_ull() { ull x; scanf("%" SCNu64, &x); return x; }
                         ~~~~~^~~~~~~~~~~~~~~~
salesman.cpp: In function 'dbl read_dbl()':
salesman.cpp:51:30: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
 dbl read_dbl() { dbl x; scanf("%lf", &x); return x; }
                         ~~~~~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...