75pts求调
查看原帖
75pts求调
1328520
qizhonglei楼主2025/7/2 19:16
#include<bits/stdc++.h>
using namespace std;
int n,m,k,x[10005],y[10005],f[10005][1005][2],cnt[10005];
struct funk{
    int l,h;
}t[10005];
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=0;i<n;i++)
        scanf("%d%d",&x[i],&y[i]);
    for(int i=0;i<=n;i++)
        t[i].l=1,t[i].h=m;
    for(int i=1;i<=k;i++){
        int p;
        scanf("%d",&p),cnt[p]++;
        scanf("%d%d",&t[p].l,&t[p].h);
        t[p].l++,t[p].h--;
	}
    for(int i=1;i<=n;i++)
        cnt[i]+=cnt[i-1];
    memset(f,0x3f,sizeof(f));
    for(int i=1;i<=m;i++)
        f[0][i][0]=f[0][i][1]=0;
	for(int i=1;i<=n;i++){
		for(int j=t[i-1].l;j<=t[i-1].h;j++){
			int now=j-y[i-1];
			if(now>=t[i].l&&now<=t[i].h)
				f[i][now][0]=min(f[i][now][0],min(f[i-1][j][0],f[i-1][j][1]));
		}
		for(int j=t[i-1].l;j<=t[i-1].h;j++){
			int now=min(j+x[i-1],m);
			f[i][now][1]=min(f[i][now][1],min(f[i-1][j][0],f[i-1][j][1])+1);
		} 
		for(int j=x[i-1]+1;j<=t[i].h;j++){
            f[i][j][1]=min(f[i][j][1],f[i][j-x[i-1]][1]+1);
        }
		bool can=0;
		for(int j=t[i].l;j<=t[i].h;j++)
			if(f[i][j][0]<=1e9||f[i][j][1]<=1e9)
				can=1;
		if(!can){
			printf("%d\n%d",0,cnt[i-1]);
			return 0;
		}
	}
	int ans=1e9;
	for(int i=1;i<=m;i++)
		ans=min(ans,min(f[n][i][0],f[n][i][1]));
	printf("%d\n%d",1,ans);
    return 0;
}
2025/7/2 19:16
加载中...