75pts 求调【玄关!】
查看原帖
75pts 求调【玄关!】
743014
_H17_楼主2024/9/10 22:51
#include<bits/stdc++.h>
#define move sahfaisd
using namespace std;
constexpr int N=10001,INF=0x3f3f3f3f;
int n,m,k,ans_fail,f[2][N];
pair<int,int>move[N],tunnel[N];
int main(){
    ios::sync_with_stdio(0),
    cin.tie(0);
	cin>>n>>m>>k;
	for(int i=0;i<n;i++){
		cin>>move[i].first>>move[i].second;
		tunnel[i]={0,m+1};
	}
	tunnel[n]={0,m+1};
	for(int i=1,p,l,h;i<=k;i++){
		cin>>p>>l>>h;
		tunnel[p]={max(l,0),min(h,m+1)};
	}
	memset(f,0x3f,sizeof(f));
	for(int i=tunnel[0].first+1;i<tunnel[0].second;i++)
		f[0][i]=0;
	for(int i=1,x,y;i<=n;i++){
		x=move[i-1].first,y=move[i-1].second;
		for(int j=1;j<=m;j++)
		    f[i&1][j]=INF;
		if(tunnel[i].first<m&&m<tunnel[i].second)
			for(int k=tunnel[i-1].first+1;k<tunnel[i-1].second;k++)
				if(f[i&1^1][k]!=INF)
					f[i&1][m]=min(f[i&1][m],f[i&1^1][k]+max((m-k+x-1)/x,1)),ans_fail=i;
		for(int j=max(tunnel[i-1].first+1,tunnel[i].first-x+1);j<min(tunnel[i-1].second,tunnel[i].second-x);j++)
			if(f[i&1^1][j]!=INF)
				f[i&1][j+x]=min(f[i&1][j+x],f[i&1^1][j]+1),ans_fail=i;
		for(int j=tunnel[i].first+x+1;j<tunnel[i].second;j++)
		    if(f[i&1][j-x]!=INF)
		        f[i&1][j]=min(f[i&1][j],f[i&1][j-x]+1),ans_fail=i;
		for(int j=tunnel[i].first+1;j<tunnel[i].second;j++)
			if(j+y<=m&&f[i&1^1][j+y]!=INF)
				f[i&1][j]=min(f[i&1][j],f[i&1^1][j+y]),ans_fail=i;
		if(ans_fail!=i)
			break;
	}
	if(ans_fail!=n){
		cout<<"0\n";
		int ans=0;
		for(int i=1;i<=ans_fail;i++)
			if(tunnel[i]!=make_pair(0,m+1))
				ans++;
		cout<<ans;
		return 0;
	}
	cout<<"1\n"<<(*min_element(f[n&1]+1,f[n&1]+m+1));
	return 0;
}
2024/9/10 22:51
加载中...