Submission #1341842

#TimeUsernameProblemLanguageResultExecution timeMemory
1341842blacktulipCollecting Stamps 3 (JOI20_ho_t3)C++20
100 / 100
113 ms129452 KiB
//Hello!..
//dört böler altı artı iki ama ne böler altı ne böler iki
//Başarı, Boş Duranın Hakkı Değil... Koşturanın Hakkıdır. Hakan?
//Ne yapayım, elimden gelen bu :(
//S'il vous plait
#include <bits/stdc++.h>
using namespace std;

typedef long long lo; 

#define fi first
#define se second
#define endl "\n"
#define pb push_back
#define int long long
#define fio() ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define FOR for(int i=1;i<=n;i++)
#define setrandom mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define getrandom(a,b) uniform_int_distribution<int>(a,b)(rng)
#define mid ((start+end)/2)
#define ort ((bas+son)/2)
#define _ << " " <<

const lo inf = 1000000000000000;
const lo li = 202;
const lo mod = 1000000007;

int n,m,a[li],k,flag,t,b[li],dp[li][li][li][2];
int cev;
string s;
vector<int> v;

inline int dist(int x,int y){
	if(x>y)swap(x,y);
	return min(y-x,x+k-y);
}

int32_t main(){
	fio();
	cin>>n>>k;
	FOR cin>>a[i];
	FOR cin>>b[i];
	for(int i=0;i<=n+1;i++){
		for(int j=0;j<=n+1;j++){
			for(int ii=0;ii<=n;ii++)dp[i][j][ii][0]=inf,dp[i][j][ii][1]=inf;
		}
	}
	dp[0][n+1][0][0]=0;
	dp[0][n+1][0][1]=0;
	for(int i=0;i<=n;i++){
		for(int j=n+1;j>i;j--){
			for(int ii=0;ii<=n;ii++){
				if(i)dp[i][j][ii][0]=min(dp[i][j][ii][0],dp[i-1][j][ii][0]+dist(a[i],a[i-1]));
				if(i)dp[i][j][ii][0]=min(dp[i][j][ii][0],dp[i-1][j][ii][1]+dist(a[i],a[j]));
				if(j!=n+1)dp[i][j][ii][1]=min(dp[i][j][ii][1],dp[i][j+1][ii][1]+dist(a[j],a[j+1]));
				if(j!=n+1)dp[i][j][ii][1]=min(dp[i][j][ii][1],dp[i][j+1][ii][0]+dist(a[j],a[i]));
				//~ cerr<<i-1 _ j _ "AA" _ i _ j+1 _ "BB" _ ii _ endl;
				//~ if(i==1 && ii==2 && j==6)cerr<<dp[i-1][j][ii-1][0] _ dp[i-1][j][ii-1][1] _ dist(a[i],a[i-1]) _ dist(a[i],a[j]) _ "AA\n";
				if(ii && i && dp[i-1][j][ii-1][0]+dist(a[i],a[i-1])<=b[i])dp[i][j][ii][0]=min(dp[i][j][ii][0],dp[i-1][j][ii-1][0]+dist(a[i],a[i-1]));
				if(ii && i && dp[i-1][j][ii-1][1]+dist(a[i],a[j])<=b[i])dp[i][j][ii][0]=min(dp[i][j][ii][0],dp[i-1][j][ii-1][1]+dist(a[i],a[j]));
				if(ii && j!=n+1 && dp[i][j+1][ii-1][1]+dist(a[j],a[j+1])<=b[j])dp[i][j][ii][1]=min(dp[i][j][ii][1],dp[i][j+1][ii-1][1]+dist(a[j],a[j+1]));
				if(ii && j!=n+1 && dp[i][j+1][ii-1][0]+dist(a[j],a[i])<=b[j])dp[i][j][ii][1]=min(dp[i][j][ii][1],dp[i][j+1][ii-1][0]+dist(a[j],a[i]));
			}
		}
	}
	//~ cerr<<dp[0][6][1] _ dp[0][5][2] _ dp[0][4][3] _ dp[0][3][4] _ "BB\n";
	//~ cerr<<dp[0][6][1][1] _ dist(a[1],a[6]) _ "ABC"<<endl;
	//~ cerr<<dp[1][6][2][0] _ dist(a[1],a[6]) _ "ABC"<<endl;
	for(int ii=n;ii>=0;ii--){
		for(int i=0;i<=n+1;i++){
			for(int j=n+1;j>i;j--)if(dp[i][j][ii][0]!=inf || dp[i][j][ii][1]!=inf){cout<<ii<<endl;return 0;}
		}
	}
	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...