제출 #1344341

#제출 시각아이디문제언어결과실행 시간메모리
1344341JuanJLMarathon Race 2 (JOI24_ho_t3)C++20
62 / 100
1598 ms126496 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 = 50+5;

ll n,l;
ll x[MAXN];

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

ll dp[MAXN][MAXN][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;
}

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

	cin>>q;
	forn(i,0,q){
		cin>>s[i]>>g[i]>>t[i];
		mset(dp,-1);
		ll res = f(0,n-1,0,g[i])+abs(x[0]-s[i]);
		res=min( res , f(0,n-1,1,g[i])+abs(x[n-1]-s[i]));	
		//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...