Submission #785262

#TimeUsernameProblemLanguageResultExecution timeMemory
785262andecaandeciGlobal Warming (CEOI18_glo)C++17
55 / 100
2057 ms6108 KiB
#include <bits/stdc++.h> using namespace std; # define int long long # define fir first # define sec second # define pb push_back # define endl "\n" const int cnst = 2e5+5; bool mutipletestcase = 0; //bool debug = false; void solve() { int n, x; cin >> n >> x; int num[n+5]; for(int i = 1; i<=n; i++) cin >> num[i]; if(x == 0) { vector<int> vec; vec.pb(num[1]); for(int i = 2; i<=n; i++) { if(num[i] > vec[vec.size()-1]) {vec.pb(num[i]); continue;} int lo = 0; int hi = vec.size()-1; int res = vec.size()-1; while(lo <= hi) { int mid = (lo+hi)/2; // cerr << "I: " << vec[mid] << " " << num[i] << endl; if(vec[mid] < num[i]) lo = mid+1; else hi = mid-1, res = mid; } // cerr << i << " " << res << endl; vec[res] = num[i]; } // for(auto v: vec) cerr << v << " "; cout << vec.size() << endl; return; } else if(x == 1e9) { int l[n+5], r[n+5]; l[1] = 1; l[0] = 0; vector<int> vec; vec.pb(num[1]); for(int i = 2; i<=n; i++) { if(num[i] > vec[vec.size()-1]) {vec.pb(num[i]); l[i] = vec.size(); continue;} int lo = 0; int hi = vec.size()-1; int res = vec.size()-1; while(lo <= hi) { int mid = (lo+hi)/2; // cerr << "I: " << vec[mid] << " " << num[i] << endl; if(vec[mid] < num[i]) lo = mid+1; else hi = mid-1, res = mid; } // cerr << i << " " << res << endl; vec[res] = num[i]; l[i] = vec.size(); } vec.clear(); vec.pb(num[n]); r[n] = 1, r[n+1] = 0; for(int i = n-1; i>=1; i--) { if(num[i] < vec[vec.size()-1]) {vec.pb(num[i]); r[i] = vec.size(); continue;} int lo = 0; int hi = vec.size()-1; int res = vec.size()-1; while(lo <= hi) { int mid = (lo+hi)/2; // cerr << "I: " << vec[mid] << " " << num[i] << endl; if(vec[mid] > num[i]) lo = mid+1; else hi = mid-1, res = mid; } // cerr << i << " " << res << endl; vec[res] = num[i]; r[i] = vec.size(); } // for(int i = 1; i<=n; i++) cerr << l[i] << " "; cerr << endl; // for(int i = 1; i<=n; i++) cerr << r[i] << " "; cerr << endl; int ans = 0; for(int i = 0; i<=n; i++) { ans = max(ans, l[i]+r[i+1]); } cout << ans << endl; return; } int ans = 0; int dp[n+5][3]; memset(dp, 0, sizeof(dp)); dp[n][1] = dp[n][0] = 1; for(int i = n-1; i>=1; i--) { for(int k = i+1; k<=n; k++) { if(num[k] > num[i]) { dp[i][0] = max(dp[i][0], dp[k][0]); dp[i][1] = max(dp[i][1], dp[k][1]); } else if(num[i]-num[k] < x) { dp[i][0] = max(dp[i][0], dp[k][1]); } } dp[i][0] += 1, dp[i][1] += 1; ans = max(ans, dp[i][0]); } // for(int i = 1; i<=n; i++) cerr << dp[i][0] << " " << dp[i][1] << endl; cerr << endl; cout << ans << endl; } signed main() { ios_base::sync_with_stdio(false); int t = 1; if(mutipletestcase) cin >> t; while(t--) solve(); }
#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...