Submission #921818

#TimeUsernameProblemLanguageResultExecution timeMemory
921818StefanSebezGlobal Warming (CEOI18_glo)C++14
100 / 100
715 ms36976 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=6*1e6+50;
const ll inf=1e9+50;
int root,nc,maks[N],lc[N],rc[N];
int pref[200050],suf[200050];
ll a[200050];
void Update(int &c,ll ss,ll se,int qind,int qval)
{
	if(!c) c=++nc;
	if(ss==se) {maks[c]=max(maks[c],qval);return;}
	ll mid=(ss+se)/2;if(ss+se<0) mid--;
	if(qind<=mid) Update(lc[c],ss,mid,qind,qval);
	else Update(rc[c],mid+1,se,qind,qval);
	maks[c]=max(maks[lc[c]],maks[rc[c]]);
}
int Get(int c,ll ss,ll se,ll qs,ll qe)
{
	if(qs>qe || !c) return 0;
	if(qs<=ss && se<=qe) return maks[c];
	if(qe<ss || se<qs) return 0;
	ll mid=(ss+se)/2;if(ss+se<0) mid--;
	return max(Get(lc[c],ss,mid,qs,qe),Get(rc[c],mid+1,se,qs,qe));
}
void CLEAR(){
	for(int i=0;i<=nc;i++) maks[i]=lc[i]=rc[i]=0;
	root=nc=0;
}
int main()
{
    int n;ll x;scanf("%i%lld",&n,&x);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    for(int i=1;i<=n;i++)
	{
		pref[i]=1+Get(root,0,inf,0,a[i]-1);
		Update(root,0,inf,a[i],pref[i]);
	}
	CLEAR();
	for(int i=n;i>=1;i--)
	{
		suf[i]=1+Get(root,0,inf,a[i]+1,inf);
		Update(root,0,inf,a[i],suf[i]);
	}
	CLEAR();
	/*for(int i=1;i<=n;i++) printf("%i ",pref[i]);
	printf("\n");
	for(int i=1;i<=n;i++) printf("%i ",suf[i]);
	printf("\n");*/
	int res=0;
	for(int i=1;i<=n;i++)
	{
		res=max(res,Get(root,0,2*inf,0,a[i]+x-1)+suf[i]);
		Update(root,0,2*inf,a[i],pref[i]);
		//printf("%i %i\n",i,res);
	}
	CLEAR();
	for(int i=n;i>=1;i--)
	{
		res=max(res,pref[i]+Get(root,0,2*inf,a[i]+1,2*inf));
		Update(root,0,2*inf,a[i]+x,suf[i]);
	}
	printf("%i\n",res);
    return 0;
}

Compilation message (stderr)

glo.cpp: In function 'int main()':
glo.cpp:32:21: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   32 |     int n;ll x;scanf("%i%lld",&n,&x);
      |                ~~~~~^~~~~~~~~~~~~~~~
glo.cpp:33:32: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   33 |     for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
      |                           ~~~~~^~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...