Submission #465641

#TimeUsernameProblemLanguageResultExecution timeMemory
465641mariowongFinancial Report (JOI21_financial)C++14
100 / 100
532 ms25816 KiB
#include <bits/stdc++.h>
 
using namespace std;

int n,d,ct,a[300005],seg[1200005],ans,now,indx[300005],nw[300005];
deque <int> dq;
vector <pair<int,int>  > v; 
priority_queue <pair<int,int>  > pq,del,mn;
void update(int id,int l,int r,int pos,int v){
	if (l == r)
	seg[id]=v;
	else
	{
		int mid=(l+r)/2;
		if (pos <= mid) update(id*2,l,mid,pos,v);
		else update(id*2+1,mid+1,r,pos,v);	
		seg[id]=max(seg[id*2],seg[id*2+1]);
	}
}
int query(int id,int l,int r,int x,int y){
	if (x <= l && y >= r)
	return seg[id];
	if (l > y || r < x)
	return -1;
	int mid=(l+r)/2;
	return max(query(id*2,l,mid,x,y),query(id*2+1,mid+1,r,x,y));
}
void debug(int id,int l,int r){
	cerr << seg[id] << " " << l << " " << r << "\n";
	if (l != r){
		int mid=(l+r)/2;
		debug(id*2,l,mid);
		debug(id*2+1,mid+1,r);	
	}
}
int main(){
	ios::sync_with_stdio(false); cin.tie(0);
	cin >> n >> d;
	for (int i=1;i<=n;i++){
		cin >> a[i];
		indx[i]=n+1;
		v.push_back(make_pair(a[i],i));
	}
	sort(v.begin(),v.end());
	for (int i=0;i<n;i++){
		if (i == 0 || v[i].first != v[i-1].first) ct++;
		a[v[i].second]=ct;
	}
	for (int i=1;i<=n;i++){
		mn.push(make_pair(-a[i],i));
		while (!mn.empty() && i-mn.top().second >= d){
			mn.pop();
		}
		while (!del.empty() && -del.top().first < -mn.top().first){
			indx[del.top().second]=i+1;
			del.pop();
		}
		if (i >= d)
		del.push(make_pair(-a[i-d+1],i-d+1));
	}
/*	for (int i=1;i<=n;i++){
		cerr << a[i] << " ";
	}
	cerr << "\n";
	for (int i=1;i<=n;i++){
		cerr << indx[i] << " ";
	}
	cerr << "\n";*/
	for (int i=1;i<=n;i++){
		while (!pq.empty() && -pq.top().first == i){
			if (-pq.top().first == nw[pq.top().second])
			update(1,0,ct,pq.top().second,0);
			pq.pop(); 
		}
	//	if (i == 8)
	//	debug(1,0,ct);
	//	if (i == 8)
	//	cerr << query(1,0,ct,a[i],a[i]) << " " << query(1,0,ct,0,4) << "\n";
		now=max(query(1,0,ct,a[i],a[i]),query(1,0,ct,0,a[i]-1)+1);
		update(1,0,ct,a[i],now);
	//	cerr <<i <<  " --- " << now << "\n";
		ans=max(ans,now);
		pq.push(make_pair(-indx[i],a[i]));
		nw[a[i]]=indx[i];
	//	cout << a[i] << " " << i << " " << now << "\n";
	}
	cout << ans << "\n";
	return 0;
}
#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...