Submission #244757

#TimeUsernameProblemLanguageResultExecution timeMemory
244757eohomegrownappsGlobal Warming (CEOI18_glo)C++14
100 / 100
151 ms13304 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; struct Fenwick{ vector<ll> arr; ll n; bool startFromLeft; Fenwick(ll _n, bool _startFromLeft){ //0 to n-1 inclusive startFromLeft = _startFromLeft; n=_n; arr.resize(n+1); } ll conv(ll ind){ ind+=1; if (!startFromLeft){ ind=n+1-ind; } return ind; } void update(ll ind, ll val){ ind = conv(ind); while (ind<=n){ arr[ind]=max(arr[ind],val); ind+=ind&(-ind); } } ll query(ll ind){ ind = conv(ind); ll val = 0; while (ind>0){ val=max(val,arr[ind]); ind-=ind&(-ind); } return val; } }; vector<ll> vals; vector<ll> mp; vector<ll> lisl; vector<ll> lisr; int main(){ cin.tie(0); ios_base::sync_with_stdio(0); ll n,d; cin>>n>>d; vals.resize(n); mp.resize(n); for (ll i = 0; i<n; i++){ cin>>vals[i]; mp[i]=vals[i]; } sort(mp.begin(),mp.end()); mp.erase(unique(mp.begin(),mp.end()),mp.end()); for (ll i = 0; i<n; i++){ vals[i]=lower_bound(mp.begin(),mp.end(),vals[i])-mp.begin(); } Fenwick *fenl = new Fenwick(n+1, true); lisl.resize(n,0); for (ll i = 0; i<n; i++){ //cout<<vals[i]<<'\n'; ll mxprev = fenl->query(vals[i]); lisl[i]=mxprev+1; fenl->update(vals[i]+1,lisl[i]); } Fenwick *fenr = new Fenwick(n+1, false); lisr.resize(n,0); ll mx = 0; for (ll i = n-1; i>=0; i--){ //cout<<vals[i]<<'\n'; ll mxprev = fenr->query(vals[i]+1); lisr[i]=mxprev+1; fenr->update(vals[i],lisr[i]); mx=max(mx,lisr[i]); } Fenwick *leftdat = new Fenwick(n+1, true); for (ll i = 0; i<n; i++){ //use item i in rhs of lis //how far above can we go? //cout<<"find "<<mp[vals[i]]+d-1<<'\n'; ll mxup = lower_bound(mp.begin(),mp.end(),mp[vals[i]]+d)-mp.begin()-1; //if (mxup==mp.size()){mxup--;} ll mxval = leftdat->query(mxup); //cout<<mxup<<' '<<mxval<<' '<<lisr[i]<<' '<<mxval+lisr[i]<<'\n'; mx=max(mx,mxval+lisr[i]); leftdat->update(vals[i],lisl[i]); //cout<<mx<<'\n'; } cout<<mx<<'\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...