萌新妹子刚学OI 线性dp75pts在线求调
查看原帖
萌新妹子刚学OI 线性dp75pts在线求调
556545
_anll_楼主2024/4/17 10:38

rt,WA #7 #8 #10 #11 #13

#include<algorithm>
#include<iostream>
#include<cstring>
#define C 0x3f3f3f3f
using namespace std;
int n,m,k,qzh[10005],vu[10005],xu[10005],yu[10005],dp[10005][2005];
pair<int,int> po[1005];
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m>>k;int p,l,h;
	for(int i=1;i<=n;i++) cin>>xu[i]>>yu[i];
	for(int i=1;i<=k;i++){
		cin>>p>>l>>h;
		vu[p]=1;
		po[p]={l,h};
	}
	for(int i=1;i<=n;i++) qzh[i]=qzh[i-1]+vu[i];
	memset(dp,0x3f,sizeof(dp));
	for(int i=1;i<=m;i++) dp[0][i]=0;
	for(int i=1;i<=n;i++){
		int x=xu[i],y=yu[i];
		for(int j=1;j<m;j++){ 
			dp[i][j]=min({dp[i][j],dp[i][j-x]+1,dp[i-1][j-x]+1});
		}
		for(int k=x;k>=0;k--){
			dp[i][m]=min({dp[i][m],dp[i][m-k]+1,dp[i-1][m-k]+1});
		}
		for(int j=1;j<m;j++){
			dp[i][j]=min(dp[i][j],dp[i-1][j+y]);
		}
		int ans=C;
		for(int j=1;j<=m;j++){
			if(!(!vu[i]||po[i].first<j&&j<po[i].second)) dp[i][j]=C;
			ans=min(ans,dp[i][j]);
		}
		if(ans>=C){
			cout<<0<<endl<<qzh[i-1]<<endl;
			return 0;
		}
	}
	int ans=C;
	for(int i=1;i<=m;i++) ans=min(ans,dp[n][i]);
	cout<<1<<endl<<ans<<endl;
	return 0;
}
2024/4/17 10:38
加载中...