求助,如何优化,85pts,TLE3个点
查看原帖
求助,如何优化,85pts,TLE3个点
1353330
K_J_M楼主2024/8/22 11:18
#include<bits/stdc++.h>
using namespace std;
#define oo 0x3fffffff
const int N = 1e4+10;
const int M = 1e3+10;
int n,m,k,p,l,h,x[N],y[N],dp[N][M],pre[N];
struct node{
	int l,h;
}a[N];
inline int read(){
	int x=0,w=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') w=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<1)+(x<<3)+c-'0';
		c=getchar();
	}
	return x*w;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie();cout.tie(0);
	n=read(),m=read(),k=read();
	for(register int i=1;i<=n;++i){
		x[i]=read(),y[i]=read();
	}
	++n;
	for(register int i=1;i<=n;++i){
		a[i].l=0,a[i].h=m+1;
	}
	for(register int i=1;i<=k;++i){
		p=read(),l=read(),h=read();
		a[p+1].l=l;
		a[p+1].h=h;
		pre[p+1]=1;
	}
	for(register int i=1;i<=n;++i) pre[i]+=pre[i-1];
	for(register int i=0;i<=n+1;++i){
		for(register int j=0;j<=m+1;++j){
			dp[i][j]=oo;
		}
	}
	for(register int i=1;i<=m;++i) if(i<a[1].h&&i>a[1].l) dp[1][i]=0;
	for(register int i=2;i<=n;++i){
		for(register int j=a[i].l+1;j<a[i].h;++j){
			if(j+y[i-1]<=m&&j+y[i-1]<a[i-1].h&&j+y[i-1]>a[i-1].l) dp[i][j]=min(dp[i][j],dp[i-1][j+y[i-1]]);
			if(j==m){
				if(a[i-1].h==m+1){
					dp[i][j]=min(dp[i][j],dp[i-1][m]+1);
				}else{
					dp[i][j]=min(dp[i][j],dp[i-1][a[i-1].h-1]+((m-a[i-1].h+1)%x[i-1]==0? (m-a[i-1].h+1)/x[i-1]:(m-a[i-1].h+1)/x[i-1]+1));
				}
				for(register int lh=a[i-1].l+1;lh<a[i-1].h-1;++lh){
					dp[i][j]=min(dp[i][j],dp[i-1][lh]+((j-lh)%x[i-1]==0? (j-lh)/x[i-1]:(j-lh)/x[i-1]+1));
				}
			}else{
				for(register int r=1;j-r*x[i-1]>=1;++r){
					if(j-r*x[i-1]>a[i-1].l&&j-r*x[i-1]<a[i-1].h) dp[i][j]=min(dp[i][j],dp[i-1][j-r*x[i-1]]+r);
				}
			}
		}
	}
	int ans=oo;
	for(int j=a[n].l+1;j<a[n].h;++j) ans=min(ans,dp[n][j]);
	if(ans==oo){
		cout<<0<<endl;
		for(register int i=n;i>=1;--i){
			for(register int j=1;j<=m;++j){
				if(dp[i][j]!=oo){
					cout<<pre[i];
					return 0;
				}
			}
		}
	}else{
		cout<<1<<endl<<ans;
	}
	return 0;
} 
2024/8/22 11:18
加载中...