求 hack
查看原帖
求 hack
749714
xyzfrozen楼主2023/8/23 11:50
#include<bits/stdc++.h>
#define pt putchar(' ')
#define nl puts("")
#define pi pair<int,int>
#define fi first
#define se second
#define pb push_back
#define go(it) for(auto &it:as[x]) //注意加了&
using namespace std;

int fr(){ //double 不能快读!!!!
    int x=0,flag=1;
    char ch=getchar();
    while(ch<'0' || ch>'9'){
        if(ch=='-') flag=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9'){
        x=x*10+(ch-'0');
        ch=getchar();
    }
    return x*flag;
}
void fw(int x){
	if(x<0) putchar('-'),x=-x;
    if(x>9) fw(x/10);
    putchar(x%10+'0');
}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}

const int N=510;
int n,m,ans;
int f[N][N][2],g[N][N][2];
pi pos[N];

int main()
{
	n=fr(),m=fr();
	for(int i=1;i<=n;i++) pos[i].fi=fr(); //位置
	for(int i=1;i<=n;i++) pos[i].se=fr(); 、、截止时间
	pos[++n]={0,0}; //起点
	for(int i=1;i<=n;i++) //断环成链
		pos[i+n]=pos[i],pos[i+n].fi+=m;
	sort(pos+1,pos+1+n*2);
	
	//f[l,r][0/1] 考虑 [l,r] 内的最大答案
	//g[l,r][0/1] 对应 f[l,r] 的时间
	
	memset(g,0x3f,sizeof g);
	memset(f,-0x3f,sizeof f);
	g[n+1][n+1][0]=g[n+1][n+1][1]=0;
	f[n+1][n+1][0]=f[n+1][n+1][1]=0;
	
	for(int len=2;len<=n*2;len++)
		for(int i=1;i+len-1<=n*2;i++)
		{
			int j=i+len-1;
			
			int &x=f[i][j][0],&y=f[i][j][1],&a=g[i][j][0],&b=g[i][j][1];
			
			if(x<f[i+1][j][0]+(g[i+1][j][0]+pos[i+1].fi-pos[i].fi<=pos[i].se))
			{
				x=f[i+1][j][0]+(g[i+1][j][0]+pos[i+1].fi-pos[i].fi<=pos[i].se);
				a=g[i+1][j][0]+pos[i+1].fi-pos[i].fi;
			}
			else if(x==f[i+1][j][0]+(g[i+1][j][0]+pos[i+1].fi-pos[i].fi<=pos[i].se))
				a=min(a,g[i+1][j][0]+pos[i+1].fi-pos[i].fi);
			
			if(x<f[i+1][j][1]+(g[i+1][j][1]+pos[j].fi-pos[i].fi<=pos[i].se))
			{
				x=f[i+1][j][1]+(g[i+1][j][1]+pos[j].fi-pos[i].fi<=pos[i].se);
				a=g[i+1][j][1]+pos[j].fi-pos[i].fi;
			}
			else if(x==f[i+1][j][1]+(g[i+1][j][1]+pos[j].fi-pos[i].fi<=pos[i].se))
				a=min(a,g[i+1][j][1]+pos[j].fi-pos[i].fi);
			
			if(y<f[i][j-1][0]+(g[i][j-1][0]+pos[j].fi-pos[i].fi<=pos[j].se))
			{
				y=f[i][j-1][0]+(g[i][j-1][0]+pos[j].fi-pos[i].fi<=pos[j].se);
				b=g[i][j-1][0]+pos[j].fi-pos[i].fi;
			}
			else if(y==f[i][j-1][0]+(g[i][j-1][0]+pos[j].fi-pos[i].fi<=pos[j].se))
				b=min(b,g[i][j-1][0]+pos[j].fi-pos[i].fi);
			
			if(y<f[i][j-1][1]+(g[i][j-1][1]+pos[j].fi-pos[j-1].fi<=pos[j].se))
			{
				y=f[i][j-1][1]+(g[i][j-1][1]+pos[j].fi-pos[j-1].fi<=pos[j].se);
				b=g[i][j-1][1]+pos[j].fi-pos[j-1].fi;
			}
			else if(y==f[i][j-1][1]+(g[i][j-1][1]+pos[j].fi-pos[j-1].fi<=pos[j].se))
				b=min(b,g[i][j-1][1]+pos[j].fi-pos[j-1].fi);
		}

	for(int i=1;i<=n;i++)
		ans=max({ans,f[i][i+n-1][0],f[i][i+n-1][1]});
	fw(min(n-1,ans));
	return 0;
}
2023/8/23 11:50
加载中...