제출 #464934

#제출 시각아이디문제언어결과실행 시간메모리
464934_Avocado_Global Warming (CEOI18_glo)C++14
100 / 100
656 ms22236 KiB
#include <bits/stdc++.h>
#define int int64_t
using namespace std;

vector<int>seg;

void update(int k, int v, int pos, int l, int r){
	if(l == r){
		seg[pos] = v;
		return;
	}
	if(k <= (l+r)/2) update(k, v, pos*2, l, (l+r)/2);
	else update(k, v, pos*2+1, (l+r)/2+1, r);
	
	seg[pos] = max(seg[pos*2], seg[pos*2+1]);
}

int query(int ql, int qr, int pos, int l, int r){
	if(l >= ql && r <= qr) return seg[pos];
	else if(l > qr || r < ql) return 0;
	else return max(query(ql, qr, pos*2, l, (l+r)/2), query(ql, qr, pos*2+1, (l+r)/2+1, r));
}

int bsearch(vector<int>&v, int val, int n){
	int r = n-1;
	int l = -1;
	
	while(r-l > 1){
		int x = (r+l)/2;
		if(v[x] > val) r = x;
		else l = x;
	}
	
	return v[r];
}

void print_tree(){
	int cut = 1;
	
	for(int i = 1; i<seg.size(); ++i){
		cout<<seg[i]<<" ";
		if(i == cut){
			cut = cut*2+1;
			cout<<endl;
		}
	}
	
	cout<<endl<<endl;
}
	

signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	
	int n, d; cin>>n>>d;
	
	seg.assign(n*4, 0);
	
	vector<int>v(n);
	vector<int>fred(n);
	
	for(int i = 0; i<n; ++i){
		int a; cin>>a;
		v[i] = a;
		fred[i] = a;
	}
	
	//for(auto u: v) cout<<u<<" ";
	//cout<<endl;
	
	sort(fred.begin(), fred.end());
	
	//for(auto u: fred) cout<<u<<" ";
	//cout<<endl;
	
	
	unordered_map<int, int>mp;
	
	for(int i = 0; i<n; ++i){
		mp[fred[i]] = i;
	}
	
	vector<int>lis(n);
	
	for(int i = 0; i<n; ++i){
		int cur;
		if(mp[v[i]] == 0) cur = 1;
		else cur = query(0, mp[v[i]]-1, 1, 0, n-1)+1;
		lis[i] = cur;
		update(mp[v[i]], cur, 1, 0, n-1);
	}
	
	//print_tree();
	
	
	//for(auto u: lis) cout<<u<<" ";
	//cout<<endl;
	
	seg.assign(n*4, 0);
	
	int ans = 0;
	
	update(mp[v[n-1]], 1, 1, 0, n-1);
	
	//print_tree();
	
	for(int i = n-2; i>=0; --i){
		int cur = bsearch(fred, v[i]-d, n);
		//cout<<v[i]-d<<" "<<cur<<endl;
		int suffix;
		if(cur >= fred[n-1]) suffix = 0;
		else suffix = query(mp[cur], n-1, 1, 0, n-1);
		//cout<<suffix<<" "<<lis[i]<<" "<<i<<endl;
		ans = max(ans, suffix+lis[i]);
		int upd;
		if(mp[v[i]] == n-1) upd = 1;
		else upd = query(mp[v[i]]+1, n-1, 1, 0, n-1)+1;
		update(mp[v[i]], upd, 1, 0, n-1);
		
		//print_tree();
	}
		
	cout<<ans;
	
	
	cout<<'\n';
}

컴파일 시 표준 에러 (stderr) 메시지

glo.cpp: In function 'void print_tree()':
glo.cpp:40:18: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |  for(int i = 1; i<seg.size(); ++i){
      |                 ~^~~~~~~~~~~
#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...