Submission #1322912

#TimeUsernameProblemLanguageResultExecution timeMemory
1322912neonglitchFinancial Report (JOI21_financial)C++20
100 / 100
1892 ms24620 KiB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N=4e5;
struct Data{
	int len=0,pre=0,suf=0,mx=0,dp=0;
};
Data seg[N<<2];
int n,a[N],cdp;
Data merge(Data a,Data b)
{
	Data c;
	c.mx=max(a.mx,max(b.mx,a.suf+b.pre));
	c.pre=a.pre+b.pre*(a.len==a.pre);
	c.suf=b.suf+a.suf*(b.suf==b.len);
	c.len=a.len+b.len;
	c.dp=max(a.dp,b.dp);
	return c;
}
void build(int v=1,int l=1,int r=n)
{
	if(l==r)
	{
		seg[v].pre=1;
		seg[v].len=1;
		seg[v].suf=1;
		seg[v].mx=1;
		seg[v].dp=0;
		return;
	}
	int m=(l+r)>>1;
	int lc=v<<1,rc=lc|1;
	build(lc,l,m);
	build(rc,m+1,r);
	seg[v]=merge(seg[lc],seg[rc]);
}

void set(int i,int v=1,int l=1,int r=n)
{
	if(i<l or r<i)return;
	if(l==r)
	{
		seg[v].pre=0;
		seg[v].len=1;
		seg[v].suf=0;
		seg[v].mx=0;
		seg[v].dp=cdp;
		// cout<<"At "<<l<<' '<<r<<' '<<cdp<<endl;
		return;
	}
	int m=(l+r)>>1;
	int lc=v<<1,rc=lc|1;
	set(i,lc,l,m);
	set(i,rc,m+1,r);
	seg[v]=merge(seg[lc],seg[rc]);
}
Data iden;
Data query(int ql,int qr,int v=1,int l=1,int r=n)
{
	if(qr<l or r<ql)
	{
		return iden;
	}
	if(ql<=l and r<=qr)		
	{
		return seg[v];
	}
	int m=(l+r)>>1;
	int lc=v<<1,rc=lc|1;	
	return merge(query(ql,qr,lc,l,m),query(ql,qr,rc,m+1,r));
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	int d;
	cin>>n>>d;
	vector<pair<int,int>> ord;
	for(int i=1;i<=n;i++)cin>>a[i],ord.push_back({a[i],-i});
	sort(begin(ord),end(ord));
	build();
	for(auto [x,i]:ord)
	{
		i=-i;
		cdp=0;
		set(i);
		int s=-1,e=i;
		while(s+1<e)
		{
			int mid=(s+e)/2;
			if(query(mid,i).mx<d)
			{
				e=mid;
			}
			else{
				s=mid;
			}
		}
		cdp=query(e,i).dp+1;
		set(i);
	}
	cout<<query(1,n).dp<<endl;
}
#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...