Submission #1031582

#TimeUsernameProblemLanguageResultExecution timeMemory
1031582orcslopGlobal Warming (CEOI18_glo)C++17
100 / 100
247 ms45496 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; using namespace std; using ll = long long; #define pb push_back #define all(x) begin(x), end(x) #define sz(x) (int) (x).size() struct chash { const uint64_t C = uint64_t(6283185307179586476) + 71; const uint32_t RANDOM = chrono::steady_clock::now().time_since_epoch().count(); size_t operator()(uint64_t x) const { return __builtin_bswap64((x ^ RANDOM) * C); } }; template <class K, class V> using ht = gp_hash_table <K, V, /*hash<K> for undefined chash*/ chash, equal_to<K>, direct_mask_range_hashing<>, linear_probe_fn<>, hash_standard_resize_policy<hash_exponential_size_policy<>, hash_load_check_resize_trigger<>, true>>; template <class T> class segtree { private: const T DEFAULT = 0; vector<T> tree; int n; public: segtree(int n) : n(n), tree(n * 2, DEFAULT) {} void reset(){ tree = vector<int> (2 * n, DEFAULT); } void update(int k, T val) { k += n; tree[k] = val; for (k /= 2; k >= 1; k /= 2) { tree[k] = max(tree[2 * k], tree[2 * k + 1]); } } T query(int a, int b) { T s = DEFAULT; for (a += n, b += n; a <= b; a /= 2, b /= 2) { if (a % 2 == 1) { s = max(s, tree[a++]); } if (b % 2 == 0) { s = max(s, tree[b--]); } } return s; } }; const int MAXN = 2e5 + 5; int n, d; int v[MAXN]; int ps[MAXN]; int ss[MAXN]; vector<int> cc; ht<int, int> mp; int32_t main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> d; for(int i = 0; i < n; i++){ cin >> v[i]; cc.pb(v[i]); cc.pb(v[i] - d); cc.pb(v[i] + d); } sort(all(cc)); cc.erase(unique(all(cc)), cc.end()); for(int i = 0; i < sz(cc); i++){ mp[cc[i]] = i; } segtree<int> tree(sz(cc) + 2); for(int i = 0; i < n; i++){ int curr = mp[v[i]]; ps[i] = tree.query(0, curr - 1) + 1; if(tree.query(curr, curr) < ps[i]) { tree.update(curr, ps[i]); } } tree.reset(); for(int i = n - 1; i >= 0; i--){ int curr = mp[v[i]]; ss[i] = tree.query(curr + 1, sz(cc) - 1) + 1; if(tree.query(curr, curr) < ss[i]){ tree.update(curr, ss[i]); } } tree.reset(); int ans = 0; for(int i = n - 1; i >= 0; i--){ ans = max(ans, ps[i] + tree.query(mp[v[i] - d] + 1, sz(cc) - 1)); if(tree.query(mp[v[i]], mp[v[i]]) < ss[i]){ tree.update(mp[v[i]], ss[i]); } } cout << ans << '\n'; // for(int i = 0; i < n; i++){ // cout << ss[i] << ' '; // } return 0; }

Compilation message (stderr)

glo.cpp: In instantiation of 'segtree<T>::segtree(int) [with T = int]':
glo.cpp:78:33:   required from here
glo.cpp:28:9: warning: 'segtree<int>::n' will be initialized after [-Wreorder]
   28 |     int n;
      |         ^
glo.cpp:27:15: warning:   'std::vector<int> segtree<int>::tree' [-Wreorder]
   27 |     vector<T> tree;
      |               ^~~~
glo.cpp:31:5: warning:   when initialized here [-Wreorder]
   31 |     segtree(int n) : n(n), tree(n * 2, DEFAULT) {}
      |     ^~~~~~~
#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...