Submission #1179084

#TimeUsernameProblemLanguageResultExecution timeMemory
1179084petezaGlobal Warming (CEOI18_glo)C++20
10 / 100
86 ms9800 KiB
#include <bits/stdc++.h>
using namespace std;

int n, x;
int fwk[200005];
int froml[200005], fromr[200005];
tuple<int, int, int> tp[200005], temp[200005];

void upd(int x, int val) {
    //cout << x << ' ' << val << '\n';
    for(;x<=200000;x+=x&-x)
        fwk[x] = max(fwk[x], val);
}

int qr(int x) {
    int mx = INT_MIN;
    for(;x;x-=x&-x)
        mx = max(mx, fwk[x]);
    return mx;
}

int mgsort(int l, int r) {
	if(l>=r) return 0;
	int mid = (l+r)>>1;
	int res = max(mgsort(l, mid), mgsort(mid+1, r)); 
	int p1=l, p2=mid+1;
	deque<pair<int, int>> deq;
	for(int i=l;i<=r;i++) {
		if(p1 > mid) temp[i] = tp[p2++];
		else if(p2 > r) temp[i] = tp[p1++];
		else {
			if(get<0>(tp[p1]) >= get<0>(tp[p2])) {
				while(!deq.empty() && get<2>(tp[p2]) >= deq.front().second) deq.pop_front();
				deq.emplace_front(get<0>(tp[p2]), get<2>(tp[p2]));
				while(!deq.empty() && get<0>(tp[p1]) - deq.back().first >= x)
				deq.pop_back();
				if(!deq.empty()) res = max(res, deq.back().second + get<1>(tp[p1]));
				temp[i] = tp[p2++];
			} else temp[i] = tp[p1++];
		}
	}
	for(int i=l;i<=r;i++) tp[i] = temp[i];
	return res;
}

int main() {
    cin.tie(0) -> sync_with_stdio(0);
    cin >> n >> x;
    vector<int> vec(n);
    vector<pair<int, int>> pos(n);
    int i = 0;
    for(auto &e:vec) {
        cin >> e;
        pos[i] = {e, i+1}; i++;
    }
    sort(pos.begin(), pos.end(), [](pair<int, int> a, pair<int, int> b){
        if(a.first == b.first) return a.second > b.second;
        return a.first < b.first;
    });
    for(auto &e:pos) {
        froml[e.second] = qr(e.second) + 1;
        upd(e.second, froml[e.second]);
    } //calc from l
    memset(fwk, 0, sizeof fwk);
    reverse(pos.begin(), pos.end());
    for(auto &e:pos) {
        fromr[e.second] = qr(n-e.second+1) + 1;
        upd(n-e.second+1, fromr[e.second]);
    }
    //for(int i=1;i<=n;i++) cout << fromr[i] << ' ';
    int cans = *max_element(fromr, fromr+200005);
    //if(x == 0) {cout << cans; return 0;}
    //vector<pair<int, int>> vec2;
    /*set<pair<int, int>> vec2;
    for(int i=n-1;i>=0;i--) {
        if(!vec2.empty()) {
            //auto it = upper_bound(vec2.begin(), vec2.end(), make_pair(vec[i]-x, INT_MAX));
            auto it = vec2.upper_bound(make_pair(vec[i] - x, INT_MAX));
            if(it != vec2.end())
                cans = max(cans, froml[i] + it->second);
        }
        auto toins = make_pair(vec[i], fromr[i]);
        if(vec2.empty() || (--vec2.end())->second <= fromr[i]) {
            while(!vec2.empty() && (--vec2.end())->first >= vec[i]) vec2.erase(--vec2.end());
            vec2.emplace(vec[i], fromr[i]);
        };
    }
    cout << cans;*/
    for(int i=1;i<=n;i++) tp[i] = {vec[i-1], froml[i], fromr[i]};
    cout << max(cans, mgsort(1, 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...