제출 #1343610

#제출 시각아이디문제언어결과실행 시간메모리
1343610joacruMarathon Race 2 (JOI24_ho_t3)C++20
100 / 100
502 ms89840 KiB
#include <bits/stdc++.h>

#define forn(i,n) for(int i=0;i<int(n);++i)
#define fort(i,n) for(int i=0;i<=int(n);++i)
#define fori(i,a,n) for(int i=a;i<int(n);++i)
#define forit(i,a,n) for(int i=a;i<=int(n);++i)
#define ALL(v) v.begin(),v.end()
#define SZ(v) (int)v.size()

#define DBG(a) cerr<<#a<<" = "<<(a)<<endl
#define DBGA(a) cerr<<#a<<" = "<<(a)<<", ";
#define DBG2(a,b) do{DBGA(a)DBG(b);}while(0)
#define DBG3(a,b,c) do{DBGA(a)DBGA(b)DBG(c);}while(0)
#define DBG4(a,b,c,d) do{DBGA(a)DBGA(b)DBGA(c)DBG(d);}while(0)

#define LINE cerr<<"===================================="<<endl

using namespace std;

template<typename T>
ostream &operator<<(ostream &os, const vector<T> &v){
	os<<"[";
	forn(i,v.size()){
		if(i) os<<" ";
		os<<v[i];
	}
	os<<"]";
	return os;
}

typedef long long ll;
typedef long double ld;

const int MAXK = 1500, L=0, R=1;
const ll INF = 1000000000000000000;

int k;
vector<int> xs, cs, sl, sr; // suma a la izquierda, suma a la derecha

ll dp[2][MAXK][MAXK][2]; // S, L, R, E

ll run(int s, int l, int r, int e){
	//~ if(r<l) return INF;
	if(l<0) return INF;
	if(r>=k) return INF;
	
	//~ DBG4(s,l,r,e);
	
	ll &ret = dp[s][l][r][e];
	
	if(dp[s][l][r][e]!=-1) return dp[s][l][r][e];
	if(l==0&&r==k-1&&s==e){
		//~ DBG("punto inicial");
		return ret = 0; // este es el punto inicial
	}
	//~ if(e==L&&l==0) return ret = INF; // no se puede terminar en la izquierda sin hacer nada
	//~ if(e==R&&r==k-1) return ret = INF; // no se puede terminar en la derecha sin hacer nada
	
	ret = INF;
	
	//~ DBG3(e, L, R);
	if(e==L){
		ll c = sl[l]+sr[r+1]+1;
		if(l>0){
			ll aux = run(s,l-1,r,e)+c*(xs[l]-xs[l-1]);
			ret = min(ret,aux);
		}
		if(r<k-1){
			ll aux = run(s,l,r+1,!e)+c*(xs[r+1]-xs[l]);
			ret = min(ret,aux);
		}
	} else if(e==R){
		ll c = sl[l]+sr[r+1]+1;
		if(r<k-1){
			ll aux = run(s,l,r+1,e)+c*(xs[r+1]-xs[r]);
			ret = min(ret,aux);
		}
		if(l>0){
			ll aux = run(s,l-1,r,!e)+c*(xs[r]-xs[l-1]);
			ret = min(ret,aux);
		}
	} else assert(0);
	
	//~ DBG(ret);
	
	return ret;
}

void solve(){
	
	forn(a,2)forn(b,MAXK)forn(c,MAXK)forn(d,2) dp[a][b][c][d] = -1;
	
	int n, a;
	cin>>n>>a;
	
	{
		map<int,int> cnt;
		while(n--){
			int x;
			cin>>x;
			++cnt[x];
		}
		for(auto it: cnt){
			xs.push_back(it.first);
			cs.push_back(it.second);
		}
	}
	
	k = SZ(xs);
	
	//~ DBG2(xs,cs);
	
	sl.resize(k+1);
	sr.resize(k+1);
	forn(i,k) sl[i+1]=sl[i]+cs[i];
	for(int i=k-1;i>=0;--i) sr[i]=sr[i+1]+cs[i];
	
	//~ DBG2(sl, sr);
	
	int q;
	cin>>q;
	
	while(q--){
		int S, G, T;
		cin>>S>>G>>T;
		
		if(k >= MAXK){
			cout<<"No\n";
			continue;
		}
		
		int p = int(lower_bound(ALL(xs),G)-xs.begin());
		
		int l=p-1,r=p;
		
		if(p < k && xs[p] == G) l=r=p;
		else if(p==0) l=r=0;
		else if(p==k) l=r=k-1;
		
		ll best=INF, c=sl.back()+1;
		
		//~ DBG3(p,l,r);
		//~ DBG3(G,xs[l],xs[r]);
		
		// L-L
		//~ LINE;
		ll aux = run(L,l,l,L);
		//~ DBG2("LL", aux);
		aux += c*abs(xs[l]-G)+abs(xs[0]-S);
		best=min(best,aux);
		
		// L-R
		//~ LINE;
		aux = run(L,r,r,R);
		//~ DBG2("LR", aux);
		aux += c*abs(xs[r]-G)+abs(xs[0]-S);
		best=min(best,aux);
		
		// R-L
		//~ LINE;
		aux = run(R,l,l,L);
		//~ DBG2("RL", aux);
		aux+=c*abs(xs[l]-G)+abs(xs.back()-S);
		best=min(best,aux);
		
		// R-R
		//~ LINE;
		aux = run(R,r,r,R);
		//~ DBG2("RR", aux);
		aux+=c*abs(xs[r]-G)+abs(xs.back()-S);
		best=min(best,aux);
		
		//~ DBG(best);
		
		best += sl.back();
		//~ DBG(best);
		if(best<=T) cout<<"Yes\n";
		else cout<<"No\n";
	}
	
}

int main() {
	
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	
	#ifdef LOCAL
		assert(freopen("C.in", "r", stdin));
		//~ freopen("output.out", "w", stdout);
	#endif
	
	//~ #ifdef LOCAL
	//~ int tcs; cin>>tcs;
	//~ while(tcs--)
	//~ #endif
	solve();

	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...