Submission #483742

#TimeUsernameProblemLanguageResultExecution timeMemory
483742minhcoolFinancial Report (JOI21_financial)C++17
100 / 100
455 ms23876 KiB
#include<bits/stdc++.h>

using namespace std; 

#define int long long
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define foru(i, l, r) for(int i = l; i <= r; i++)
#define ford(i, r, l) for(int i = r; i >= l; i--)
#define eb emplace_back
 
typedef pair<int, int> ii;
typedef pair<ii, int> iii;
typedef pair<ii, ii> iiii;
 
const int N = 3e5 + 5, MAXN = 1e7 + 5;
 
const long long oo = 1e9 + 7, mod = 1e9 + 7;

int n, d;
ii a[N];

int IT[N << 2], dp[N];

set<ii> se;// segments with length >= d

bool out[N];

void upd(int id, int l, int r, int pos, int vl){
	if(l == r){
		IT[id] = vl;
		return;
	}
	int mid = (l + r) >> 1;
	if(pos <= mid) upd(id << 1, l, mid, pos, vl);
	else upd(id << 1 | 1, mid + 1, r, pos, vl);
	IT[id] = max(IT[id << 1], IT[id << 1 | 1]);
}

int get(int id, int l, int r, int L, int R){
	if(l > R || r < L || l > r) return 0;
	if(l >= L && r <= R) return IT[id];
	int mid = (l + r) >> 1;
	return max(get(id << 1, l, mid, L, R), get(id << 1 | 1, mid + 1, r, L, R));
}

bool cmp(ii a, ii b){
	if(a.fi != b.fi) return a.fi < b.fi;
	else return a.se > b.se;
}

void er(int temp){
	out[temp] =1 ;
	set<ii>::iterator it = se.lower_bound({temp, oo});
	if(it != se.begin()){
		//if(temp == 11) cout << temp << "\n";
		it--;
		ii tmp1 = (*it), tmp2 = {tmp1.fi, temp - 1}, tmp3 = {temp + 1, tmp1.se};
		if(tmp1.se < temp || tmp1.fi > temp) return;
		//if(temp == 11) cout << tmp1.fi << " " << tmp1.se << " " << temp << "\n";
		se.erase(tmp1);
		//cout << tmp2.fi << " " << tmp2.se << " " << tmp3.fi << " " << tmp3.se << "\n";
		if((tmp2.se - tmp2.fi + 1) >= d){
			//if(temp == 11) cout << tmp2.fi << " " << tmp2.se << "\n";
			se.insert(tmp2);
		}
		if((tmp3.se - tmp3.fi + 1) >= d) se.insert(tmp3);
	}
}

int saves[N];

void process(){
	cin >> n >> d;
	for(int i = 1; i <= n; i++){
		cin >> a[i].fi;
		a[i].se = i;
	}
	sort(a + 1, a + n + 1, cmp);
	se.insert({1, n});
	int ans = -1, itr = 1;
	for(int i = 1; i <= n; i++){
		//if(se.find({1, 11}) != se.end()) cout << i << "\n";
		int temp = a[i].se;
		//if(temp == 12) cout << out[11] << "\n";
		while(itr <= n && a[itr].fi == a[i].fi){
			er(a[itr].se);
			itr++;
		}
		//cout << i << " " << itr << "\n";
		//cout << i << "\n";
		//for(auto it : se) cout << it.fi << " " << it.se << "\n";
		int lst = 1;
		set<ii>::iterator it = se.lower_bound({temp, oo});
		if(it != se.begin()){
			it--;
			//if(temp == 12) cout << (*it).fi << " " << (*it).se << "\n";
			lst = (*it).se + 1;
		}
		saves[temp] = lst;
		//cout << i << " " << temp << " " << lst << "\n";
		dp[temp] = get(1, 1, n, lst, temp - 1) + 1;
		//cout << dp[temp] << "\n";
		upd(1, 1, n, temp, dp[temp]);
		ans = max(ans, dp[temp]);
	}
	//for(int i = 1; i <= n; i++) cout << i << " " << saves[i] << "\n";
	cout << ans;
}
 
signed main(){
	ios_base::sync_with_stdio(0);

	#ifdef nqm
		freopen("input.inp", "r", stdin);
		freopen("output.out", "w", stdout);
	#endif
	#ifndef nqm
		
	#endif

	process();
}
#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...