제출 #1325609

#제출 시각아이디문제언어결과실행 시간메모리
1325609JuanJLCollecting Stamps 3 (JOI20_ho_t3)C++20
100 / 100
1840 ms273300 KiB
#include <bits/stdc++.h>

#define fst first
#define snd second
#define pb push_back
#define forn(i,a,b) for(int i=  a; i<b; i++)
#define ALL(x) x.begin(),x.end()
#define SZ(x) (int)x.size()
#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;

#ifdef D
	#define debug(x) cout << x
#else
	#define debug(x) //nothing
#endif

#define INF ((ll)1000000000)

const int MAXN = 201;

struct Node{
	ll left;
	ll right;
	ll type; // 0 left 1 right
	ll cnt;
	Node(ll left, ll right,ll type,  ll cnt): left(left), right(right), type(type) , cnt(cnt) {}
};

bool operator<(const Node &a, const Node &b){
	if(a.cnt!=b.cnt) return a.cnt<b.cnt;
	if(a.right-a.left !=b.right-b.left) return a.right-a.left < b.right-b.left;
	return a.type<b.type;
}

vector<pair<ll,ll>> point; 
ll n,L;

//IMPORTANTE
//acordarse de tener punto 1 

ll best = 0;
ll dist[MAXN][MAXN][3][MAXN];

void dijkstra(){
	
	mset(dist,-1);

	priority_queue<pair<ll,Node>> pq; pq.push({0,Node(0,SZ(point)-1,0,0)});


	while(!pq.empty()){
		ll cost = pq.top().fst*-1;
		Node rnd = pq.top().snd;
		ll l = rnd.left;
		ll r = rnd.right;
		ll t = rnd.type;
		ll cnt = rnd.cnt;
		pq.pop();
		if(dist[l][r][t][cnt]!=-1) continue;
		/*cout<<l<<" "<<r<<" "<<t<<" "<<cnt<<" "<<cost<<'\n';
		cout<<point[l].fst<<" -- "<<point[r].fst<<'\n';*/
		dist[l][r][t][cnt]=cost;
		best=max(best, cnt);
		if(t==1){
		
			{
				ll nl = l;
				ll nr = r-1;
				ll nt = t;
				if(nl<nr){
					ll ncost = cost + abs(point[r].fst-point[nr].fst);
					ll ncnt = cnt + (ncost<=point[nr].snd?1:0);
					if(dist[nl][nr][nt][ncnt]==-1) pq.push({ncost*-1, Node( nl, nr, nt, ncnt )});
				}
			}
			
			{
				ll nl = l+1;
				ll nr = r;
				ll nt = (t+1)%2;
				if(nl<nr){
					ll ncost = cost + abs((L-point[r].fst)+point[nl].fst);
					ll ncnt = cnt + (ncost<=point[nl].snd?1:0);
					if(dist[nl][nr][nt][ncnt]==-1)	pq.push({ncost*-1, Node( nl, nr, nt, ncnt )});
				}
			}
			
		}else{
			{
				ll nl = l;
				ll nr = r-1;
				ll nt = (t+1)%2;
				if(nl<nr){
					ll ncost = cost + abs((L-point[nr].fst)+point[l].fst);
					ll ncnt = cnt + (ncost<=point[nr].snd?1:0);
					if(dist[nl][nr][nt][ncnt]==-1)	pq.push({ncost*-1, Node( nl, nr, nt, ncnt )});
				}
			}
						
			{
				ll nl = l+1;
				ll nr = r;
				ll nt = t;
				if(nl<nr){
					ll ncost = cost + abs(point[l].fst-point[nl].fst);
					ll ncnt = cnt + (ncost<=point[nl].snd?1:0);
					if(dist[nl][nr][nt][ncnt]==-1)	pq.push({ncost*-1, Node( nl, nr, nt, ncnt )});
				}
			}
		}
	}
}


int main(){ FIN;
	cin>>n>>L;
	
	point.clear();
	point.resize(n+2);
	point[0]={0,-1};
	point[n+1]={L,-1};
	forn(i,1,n+1) cin>>point[i].fst;
	forn(i,1,n+1) cin>>point[i].snd;

	dijkstra();


	cout<<best<<'\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...