Submission #1183585

#TimeUsernameProblemLanguageResultExecution timeMemory
1183585vyaductGlobal Warming (CEOI18_glo)C++20
100 / 100
385 ms47216 KiB
#include <algorithm> #include <bits/stdc++.h> #include <queue> using namespace std; typedef long long ll; #ifdef LOCAL #include "debug.h" #else #define dbg(x) 42 #endif void setIo(string in="", string out=""){ if (!in.empty() && !out.empty()){ freopen(in.c_str(), "r", stdin); freopen(out.c_str(), "w", stdout); } ios::sync_with_stdio(false); cin.tie(0); } #define all(c) (c).begin(), (c).end() #define sz(c) (int)(c).size() #define vt vector #define pb push_back #define F first #define S second #define P pair class segtree { private: struct node { ll x; }; node single(ll v){ return {v}; } node merge(node a, node b){ return single(max(a.x, b.x)); } int size; vector<node> arr; node fill = single(0ll); node neutral = single(0ll); void set(int i, ll v, int x, int lx, int rx){ if (rx - lx == 1){ arr[x] = single(v); return; } int m = (lx+rx)/2; if (i < m){ set(i, v, 2*x+1, lx, m); } else { set(i, v, 2*x+2, m, rx); } arr[x] = merge(arr[2*x+1], arr[2*x+2]); } node query(int l, int r, int x, int lx, int rx){ if (l >= rx || r <= lx) return neutral; if (l <= lx && rx <= r) return arr[x]; int m = (lx+rx)/2; node s1 = query(l, r, 2*x+1, lx, m); node s2 = query(l, r, 2*x+2, m, rx); return merge(s1,s2); } public: void init(int n) {size = 1;while(size < n) size *= 2;arr.assign(2*size, fill);} void set(int i, ll v) {return set(i, v, 0, 0, size);} ll query(int l, int r) {return query(l, r, 0, 0, size).x;} void clear(){ for (node &x: arr) x = single(0LL); } }; void solve(){ int n; ll x; cin>>n>>x; vt<ll> t(n); vt<int> end(n, 1), start(n, 1); for (int i=0;i<n;i++) cin>>t[i]; vt<ll> indices = t; sort(all(indices)); indices.erase(unique(all(indices)), indices.end()); auto c = [&](ll x){return lower_bound(all(indices), x) - indices.begin();}; segtree st; st.init(sz(indices)); for (int i=0;i<n;i++){ int ind = c(t[i]); end[i] = st.query(0, ind)+1; st.set(ind, end[i]); } st.clear(); for (int i=n-1;i>=0;i--){ int ind = c(t[i]); start[i] = st.query(ind+1, n)+1; st.set(ind, start[i]); } // BAZOOKA for (int i=0;i<n;i++) { indices.pb(t[i]-x); } sort(all(indices)); indices.erase(unique(all(indices)), indices.end()); segtree final; final.init(sz(indices)); multiset<ll, greater<>> order[sz(indices)]; int best=1; for (int i=0;i<n;i++){ int ind = c(t[i]); order[ind].insert(start[i]); final.set(ind, *order[ind].begin()); } int ans=1; for (int i=0;i<n;i++){ // Removings int og = c(t[i]); if (order[og].size()>0){ order[og].erase(order[og].find(start[i])); final.set(og, *order[og].begin()); } else { final.set(og, 0); } int ind = c(t[i]-x); int query = final.query(ind+1, sz(indices)); ans = max(ans, query+end[i]); } cout << min(ans,n) << endl; } int main() { setIo(); int tt=1; // cin>>tt; while(tt--) solve(); return 0; }

Compilation message (stderr)

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