Submission #1271835

#TimeUsernameProblemLanguageResultExecution timeMemory
1271835win1702Global Warming (CEOI18_glo)C++20
10 / 100
90 ms6716 KiB
// chỉ là khung để bạn build, không phải full chạy ngay #include <bits/stdc++.h> using namespace std; struct BIT { int n; vector<int> f; BIT(int n): n(n), f(n+1,0){} void upd(int i,int v){ for(;i<=n;i+=i&-i) f[i]=max(f[i],v); } int get(int i){ int r=0; for(;i>0;i-=i&-i) r=max(r,f[i]); return r; } }; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n; long long x; cin>>n>>x; vector<long long>a(n); for(auto &v:a) cin>>v; // compress vector<long long> comp=a; sort(comp.begin(),comp.end()); comp.erase(unique(comp.begin(),comp.end()),comp.end()); auto idx=[&](long long v){ return int(lower_bound(comp.begin(),comp.end(),v)-comp.begin())+1; }; // LIS_pref BIT bit(comp.size()); vector<int> pref(n); for(int i=0;i<n;i++){ int p = idx(a[i]); pref[i] = bit.get(p-1)+1; bit.upd(p,pref[i]); } // LIS_suff (reverse) BIT bit2(comp.size()); vector<int> suff(n); for(int i=n-1;i>=0;i--){ int p = comp.size()-idx(a[i])+1; suff[i] = bit2.get(p-1)+1; bit2.upd(p,suff[i]); } // max_left_val[i] = max value on some LIS ending at i // min_right_val[i] = min value on some LIS starting at i // --> cần truy vấn phức hơn (segment tree + trace) // editorial hướng dẫn tính các mảng này. // Sau khi có max_left, min_right, duyệt và tính ans int ans = *max_element(pref.begin(),pref.end()); // baseline // ... cout << ans << "\n"; }
#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...