Submission #607577

#TimeUsernameProblemLanguageResultExecution timeMemory
607577PietraGlobal Warming (CEOI18_glo)C++14
25 / 100
2099 ms35000 KiB
#include<bits/stdc++.h>
#define meio ((i+j)>>1)
#define int long long
using namespace std ; 

const int maxn = 2e5 + 5 ; 
const int MAX = 2e5 + 5 ; 
const int lmt = 2e9 + 5 ; 

int n, x, v[maxn] ; 
vector<int> e, d, mx ; 

struct SEG{

	int node(){
		e.push_back(0), d.push_back(0), mx.push_back(0) ; 
		return max(0LL, (int)d.size() - 1) ; 
	}

	void upd(int no, int i, int j, int pos, int val){
		if(!no) return ;
		if(i == j){
			mx[no] = max(val, mx[no]) ; return ; 
		}
		if(pos <= meio){
			if(!e[no]){
				int aux = node() ; 
				e[no] = aux ; 
			}
			upd(e[no], i, meio, pos, val) ; 
		}
		else{
			if(!d[no]){
				int aux = node() ; 
				d[no] = aux ; 
			}
			upd(d[no], meio + 1, j, pos, val) ; 
		}
		mx[no] = max(mx[e[no]], mx[d[no]]) ; 
	}

	void upd2(int no, int i, int j, int pos){
		if(!no) return ;
		if(i == j){
			mx[no] = 0 ; return ; 
		}
		if(pos <= meio){
			if(!e[no]){
				int aux = node() ; 
				e[no] = aux ; 
			}
			upd2(e[no], i, meio, pos) ; 
		}
		else{
			if(!d[no]){
				int aux = node() ; 
				d[no] = aux ; 
			}
			upd2(d[no], meio + 1, j, pos) ; 
		}
		mx[no] = 0 ; 
	}

	int query(int no, int i, int j, int l, int r){
		if(!no || l > j || r < i) return 0 ; 
		if(r >= j && l <= i) return mx[no] ; 
		return max(query(e[no], i, meio, l, r), query(d[no], meio + 1, j, l, r)) ; 
	}

} Seg ; 


void solve_1(){

	e.clear(), d.clear(), mx.clear() ; 
    Seg.node() ; 
	Seg.node() ;
	
	int val = 0 ; 

	for(int i = 1 ; i <= n ; i++){
        int mx = Seg.query(1, 1, lmt, 1, v[i] - 1) ;
        Seg.upd(1, 1, lmt, v[i], mx + 1) ;
        val = max(val, v[i]) ;
    }

    int ans = Seg.query(1, 1, lmt, 1, val+1) ; 

	cout << ans << "\n" ; 

}

int try_val(int l, int r, int val){

	for(int i = l ; i <= r ; i++) v[i] += val ; 

	e.clear(), d.clear(), mx.clear() ; 
    Seg.node() ; 
	Seg.node() ;

	int va = 0 ; 

	for(int i = 1 ; i <= n ; i++){
        int mx = Seg.query(1, 1, lmt, 1, v[i] - 1) ;
        Seg.upd(1, 1, lmt, v[i], mx + 1) ;
        va = max(va, v[i]) ;
    }

    int ans = Seg.query(1, 1, lmt, 1, va + 1) ;

	for(int i = l ; i <= r ; i++) v[i] -= val ; 

	return ans ; 

}

void solve_2(){

	int ans = try_val(1, n, 0) ; 

	for(int l = 1 ; l <= n ; l++){
		for(int r = l ; r <= n ; r++){
			ans = max(ans, try_val(l, r, x)) ; 
		}
	}

	cout << ans << "\n" ; 

}

int32_t main(){

	ios_base::sync_with_stdio(false) ; cin.tie(NULL) ; 

	cin >> n >> x ; 

	for(int i = 1 ; i <= n ; i++){
		cin >> v[i] ; 
		v[i]++ ; 
	}	

	if(x == 0){
		vector<int> vec ; 
		for(int i = 1 ; i <= n ; i++) vec.push_back(v[i]) ; 
		sort(vec.begin(), vec.end()) ; 
	    vec.erase(unique(vec.begin(), vec.end()), vec.end()) ; 
	    for(int i = 1 ; i <= n ; i++) v[i] = lower_bound(vec.begin(), vec.end(), v[i]) - vec.begin() + 1 ;  
		solve_1() ; 
	}
    else solve_2() ; 

}
#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...