社区讨论

玄关70pts WA11,14,17,19,20,TLE18,求调

P1941[NOIP 2014 提高组] 飞扬的小鸟参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhizpdr2
此快照首次捕获于
2025/11/03 18:21
4 个月前
此快照最后确认于
2025/11/03 18:21
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int N=10020,M=2010;
int n,m,k,x[N],y[N],l[N],h[N];
ll dp[2][M];
bool f[2][M];
vector <int> guan; 

int read(){
	char c=getchar();
	int s=0,p=1;
	while((c<'0'||c>'9')&&c!='-') c=getchar();
	if(c=='-'){
		p=-1,c=getchar();
	}
	while(c>='0'&&c<='9'){
		s=s*10+c-'0';
		c=getchar();
	}
	return p*s;
}

int main(){
	
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++){
		x[i]=read(),y[i]=read();
		l[i]=0,h[i]=m+1;
	}
	int p;
	for(int i=1;i<=k;i++){
		p=read();
		guan.push_back(p);
		l[p]=read(),h[p]=read();
	}
	sort(guan.begin(),guan.end());
	int b=1,ok=0;//最远的到达
	bool flag,flag2=0;
	for(int i=1;i<=m;i++) f[1][i]=1;
	for(int i=1;i<=n;i++){
		flag=1;
		for(int j=1;j<=m;j++) f[!b][j]=0,dp[!b][j]=0x4f4f4f4f;
		for(int j=l[i]+1;j<h[i];j++){
			if((j+y[i])<=m&&f[b][j+y[i]]){
				f[!b][j]=1,flag=0;
				dp[!b][j]=min(dp[b][j+y[i]],dp[!b][j]);
			}
			int pjr=1;
			while((j-pjr*x[i])>0) {
				if(f[b][j-pjr*x[i]]){
					f[!b][j]=1,flag=0;
					dp[!b][j]=min((dp[b][j-pjr*x[i]]+pjr),dp[!b][j]);
					
				}
				pjr++;
			}
		}
		if(h[i]==(m+1)){
			for(int j=0;j<=x[i];j++){
				if(f[b][m-j]){
					f[!b][m]=1,flag=0;
					dp[!b][m]=min(dp[b][m-j]+1,dp[!b][m]);
				}
			}
		}
		b=!b;
		if(flag) {
			flag2=1;
			ok=i;
			break;
		}
	}
	if(!flag2){
		cout<<1<<endl;
		ll ans=0x4f4f4f4f;
		for(int j=l[n]+1;j<h[n];j++){
			int i=m;
			while(i>0){
				ans=min(ans,dp[b][i]);
				i--;
			}
		}
		cout<<ans<<endl;
	}
	else{
		cout<<0<<endl;
//		cout<<ok<<endl;
		int ans=lower_bound(guan.begin(),guan.end(),ok)-guan.begin();
		cout<<ans<<endl;
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...