Submission #1314350

#TimeUsernameProblemLanguageResultExecution timeMemory
1314350boclobanchatFinancial Report (JOI21_financial)C++20
100 / 100
373 ms20972 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e5+5;
int seg[MAXN*4],A[MAXN],pos[MAXN];
set<int> st;
bool comp(int a,int b)
{
	if(A[a]==A[b]) return a>b;
	return A[a]<A[b];
}
void update(int l,int r,int i,int val,int pos)
{
	if(i<l||r<i) return ;
	if(l==r)
	{
		seg[pos]=val;
		return ;
	}
	int mid=(l+r)/2;
	update(l,mid,i,val,pos*2);
	update(mid+1,r,i,val,pos*2+1);
	seg[pos]=max(seg[pos*2],seg[pos*2+1]);
}
int get(int l,int r,int u,int v,int pos)
{
	if(u>v) return 0;
	if(u<=l&&r<=v) return seg[pos];
	int mid=(l+r)/2;
	if(v<=mid) return get(l,mid,u,v,pos*2);
	if(mid+1<=u) return get(mid+1,r,u,v,pos*2+1);
	return max(get(l,mid,u,v,pos*2),get(mid+1,r,u,v,pos*2+1));
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,d;
	cin>>n>>d;
	for(int i=d;i<=n;i++) st.insert(i);
	for(int i=1;i<=n;i++)
	{
		cin>>A[i];
		pos[i]=i;
	}
	sort(pos+1,pos+n+1,comp);
	st.insert(0),st.insert(n+d+67);
	for(int i=1;i<=n;i++)
	{
		int p=pos[i];
		update(1,n,p,get(1,n,*prev(st.lower_bound(p))+1,p-1,1)+1,1);
		while((*st.lower_bound(p))<=p+d-1) st.erase(st.lower_bound(p));
	}
	cout<<seg[1];
}
#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...