제출 #492302

#제출 시각아이디문제언어결과실행 시간메모리
492302mosiashvililukaFinancial Report (JOI21_financial)C++14
100 / 100
726 ms18788 KiB
#include<bits/stdc++.h>
using namespace std;
int a,b,c,d,e,i,j,ii,jj,zx,xc,f[300009],dp[300009],D,pas,seg[1200009],SEG[1200009],seg2[1200009],za,l,r,z,zz,F[300009];
int se[1200009],se2[1200009];
pair <int, int> p[300009];
void pushdown(int q, int w, int rr){
	if(q!=w){
		seg2[rr*2]+=seg2[rr];
		seg2[rr*2+1]+=seg2[rr];
	}
	seg[rr]+=seg2[rr];seg2[rr]=0;
}
void upd(int q, int w, int rr){
	pushdown(q,w,rr);
	if(q>r||w<l) return;
	if(q>=l&&w<=r){
		seg2[rr]+=z;
		pushdown(q,w,rr);
		return;
	}
	upd(q,(q+w)/2,rr*2);
	upd((q+w)/2+1,w,rr*2+1);
	if(seg[rr*2+1]>=seg[rr*2]){
		seg[rr]=seg[rr*2+1];SEG[rr]=SEG[rr*2+1];
	}else{
		seg[rr]=seg[rr*2];SEG[rr]=SEG[rr*2];
	}
}
void read(int q, int w, int rr){
	pushdown(q,w,rr);
	if(q>r||w<l) return;
	if(q>=l&&w<=r){
		if(z<seg[rr]){
			z=seg[rr];zz=SEG[rr];
		}else{
			if(z==seg[rr]){
				zz=max(zz,SEG[rr]);
			}
		}
		return;
	}
	read(q,(q+w)/2,rr*2);
	read((q+w)/2+1,w,rr*2+1);
}
void UPD(int rr){
	if(rr==0) return;
	se[rr]=max(se[rr*2],se[rr*2+1]);
	UPD(rr/2);
}
void READ(int q, int w, int rr){
	if(q>r||w<l) return;
	if(q>=l&&w<=r){
		z=max(z,se[rr]);
		return;
	}
	READ(q,(q+w)/2,rr*2);
	READ((q+w)/2+1,w,rr*2+1);
}
int main(){
	ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>a>>D;
	for(i=1; i<=a; i++){
		cin>>f[i];
	}
	za=1;
	while(za<a) za*=2;
	for(i=1; i<=a; i++){
		p[i].first=f[i];p[i].second=-i;
	}
	sort(p+1,p+a+1);
	//
	for(i=1; i<=a; i++){
		seg[za+i-1]=0;SEG[za+i-1]=i;
	}
	for(i=1; i<=a; i++){
		l=max(i-D+1,1);r=i;z=1;
		upd(1,za,1);
	}
	for(ii=1; ii<=a; ii++){
		i=-p[ii].second;
		if(i>D){
			l=1;r=i-D;z=0;zz=0;
			read(1,za,1);
			if(z!=D){
				F[i]=1;
			}else{
				F[i]=zz;
			}
		}else{
			F[i]=1;
		}
		l=max(i-D+1,1);r=i;z=-1;
		upd(1,za,1);
	}
	
	//
	for(ii=1; ii<=a; ii++){
		i=-p[ii].second;
		l=F[i];r=i-1;z=0;
		READ(1,za,1);
		dp[i]=z+1;
		se[za+i-1]=dp[i];
		UPD((za+i-1)/2);
	}
	for(i=1; i<=a; i++){
		pas=max(pas,dp[i]);
	}
	/*for(i=1; i<=a; i++){
		cout<<dp[i]<<" ";
	}
	cout<<"\n";*/
	cout<<pas;
	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...