Submission #1344541

#TimeUsernameProblemLanguageResultExecution timeMemory
1344541JuanJLMarathon Race 2 (JOI24_ho_t3)C++20
100 / 100
728 ms521052 KiB
#include <bits/stdc++.h>

#define fst first
#define snd second
#define pb push_back
#define SZ(x) (int)x.size()
#define ALL(x) x.begin(),x.end()
#define forn(i,a,b) for(int i = a; i<b;i++)
#define mset(a,v) memset(a,v,sizeof(a))
#define FIN ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

using namespace std;
typedef long long ll;

const int MAXN = 2000+5;
const int MAXQ = 500000+5;

ll n;
ll N,l;
pair<ll,ll> x[MAXN];
ll ssum[MAXN];
ll psum[MAXN];

ll q;
ll s[MAXQ];
ll g[MAXQ];
ll t[MAXQ];

ll dp[MAXN][MAXN][4][4];
/*

ll f(ll l, ll r, ll lor, ll g){
	ll &res = dp[l][r][lor];
	if(res!=-1) return res;
	if(l==r){
		//cout<<1+(n)*abs(x[l]-g)<<" :: "<<l<<" "<<r<<" "<<lor<<" "<<g<<'\n';
		return 1 + (n+1)*abs(x[l]-g);
	}
	res = 0;

	ll collect  =  l + ((n-1)-r);
	ll lcost    =  (x[l+1] - x[l]) * (collect+2) + 1;
	ll rcost    =  (x[r]   - x[r-1]) * (collect+2) + 1;
	
	if(lor==0){
		res=f(l+1,r,0,g)+lcost;
		res=min( res , f(l,r,1,g)+(collect+1)*(x[r]-x[l]));
	}else{
		res=f(l,r-1,1,g)+rcost;
		res=min( res , f(l,r,0,g)+(collect+1)*(x[r]-x[l]));
	}

	//cout<<res<<" :: "<<l<<" "<<r<<" "<<lor<<" "<<g<<'\n';

	return res;
}
*/

ll frev(ll l, ll r, ll lora, ll lorf){
	ll &res=dp[l][r][lora][lorf];
	if(res!=-1) return res;
	if(l==0&&r==N-1){
		//cout<<" --  :: "<<l<<" "<<r<<" "<<lora<<" "<<lorf<<'\n';
		if(lora==lorf) return 0;
		else return 100000000000;
	}
	res=1000000000000;

	/*ll collect = l+((n-1)-r);
	ll lcost = (x[l] - x[l-1]) * (collect+1) +1;
	ll rcost = (x[r+1] - x[r]) * (collect+1) +1;*/

	ll collect = 0;
	collect+=psum[l];
	if(l==r) collect+=(r+1<N?ssum[r+1]:0);
	else collect+=ssum[r];

	collect-=x[l].snd;
	if(r!=l) collect-=x[r].snd;
	
	ll lcost = res;
	ll rcost = res;

	if(l-1>=0) lcost=(x[l].fst - x[l-1].fst) * (collect+1) + x[l-1].snd;
	if(r+1<N)  rcost=(x[r+1].fst - x[r].fst) * (collect+1) + x[r+1].snd;

	if(lora==0){
		if(l-1>=0) res=frev(l-1,r,0,lorf)+lcost;
		res=min(res, frev(l,r,1,lorf)+(collect+1)*(x[r].fst-x[l].fst));
	}else{
		if(r+1<N) res=frev(l,r+1,1,lorf)+rcost;
		res=min(res , frev(l,r,0,lorf)+(collect+1)*(x[r].fst-x[l].fst));
	}

	//cout<<res<<" :: "<<l<<" "<<r<<" "<<lora<<" "<<lorf<<" "<<collect<<'\n';

	return res;
}

int main(){
	cin>>n>>l;
	vector<ll> xx(n); forn(i,0,n) cin>>xx[i];

	map<ll,ll> mp; forn(i,0,n) mp[xx[i]]++;

	if(SZ(mp)>2000){
		ll q; cin>>q;
		forn(i,0,q) cout<<"No\n";
		return 0;
	}

	N=SZ(mp);
	ll ri = 0;
	for(auto i:mp) x[ri]={i.fst,i.snd}, ri++;

	//forn(i,0,N) cout<<x[i].fst<<","<<x[i].snd<<"  | "; cout<<'\n';

	forn(i,0,N) psum[i]=ssum[i]=x[i].snd;
	forn(i,1,N) psum[i]+=psum[i-1];
	for(int i = N-2; i>=0; i--) ssum[i]+=ssum[i+1];
	
	mset(dp,-1);

	ll a,b; a=b=1000000000000;

	vector<ll> prefa(N);
	vector<ll> suffa(N);
	vector<ll> prefb(N);
	vector<ll> suffb(N);

	forn(j,0,N){
		a = min(frev(j,j,0,0),frev(j,j,1,0));
		b = min(frev(j,j,0,1),frev(j,j,1,1));
		prefa[j]=a+x[j].snd-((n+1)*x[j].fst);
		suffa[j]=a+x[j].snd+((n+1)*x[j].fst);
		prefb[j]=b+x[j].snd-((n+1)*x[j].fst);
		suffb[j]=b+x[j].snd+((n+1)*x[j].fst);
	}

	forn(j,1,N) prefa[j]=min(prefa[j],prefa[j-1]);
	for(int j = N-2; j>=0; j--) suffa[j]=min(suffa[j],suffa[j+1]);

	forn(j,1,N) prefb[j]=min(prefb[j],prefb[j-1]);
	for(int j = N-2; j>=0; j--) suffb[j]=min(suffb[j],suffb[j+1]);


	/*cout<<"Prefa: ";
	forn(i,0,N) cout<<prefa[i]<<" "; cout<<'\n';

	cout<<"Suffa: ";
	forn(i,0,N) cout<<suffa[i]<<" "; cout<<'\n';


	cout<<"Prefb: ";
	forn(i,0,N) cout<<prefb[i]<<" "; cout<<'\n';

	cout<<"Suffb: ";
	forn(i,0,N) cout<<suffb[i]<<" "; cout<<'\n';
*/
	sort(ALL(xx));
	xx.erase(unique(ALL(xx)),xx.end());
	
	cin>>q;
	forn(i,0,q){
		cin>>s[i]>>g[i]>>t[i];
	
		ll resa;
		ll res=1000000000;
		ll resb;
		resa=resb=res;
		
		ll I = upper_bound(ALL(xx),g[i])-xx.begin();
		//cout<<"I: "<<I<<'\n';
		if(I-1>=0) resa=min(resa,prefa[I-1]+(n+1)*g[i]) , resb=min(resb,prefb[I-1]+(n+1)*g[i]);
		if(I<N) resa=min(resa,suffa[I]-(n+1)*g[i]) , resb=min(resb,suffb[I]-(n+1)*g[i]);

		resa+=abs(s[i]-x[0].fst);
		resb+=abs(s[i]-x[N-1].fst);


		res=min(resa,resb);
		/*cout<<resa<<" "<<resb<<'\n';
		cout<<res<<'\n';*/
		if(res<=t[i]) cout<<"Yes\n";
		else cout<<"No\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...
#Verdict Execution timeMemoryGrader output
Fetching results...