95分求调(玄关
查看原帖
95分求调(玄关
750524
Tmbcan楼主2024/9/8 20:35
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
using namespace std;
typedef unsigned long long ll;
template <typename T>
inline void read(T&x){
	int w=0;x=0;
	char ch = getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') w=1;
		ch = getchar();
	}
	while(ch>='0'&&ch<='9'){
		x = (x<<1)+(x<<3)+(ch^48);
		ch = getchar();
	}
	if(w) x=-x;
}
template <typename T,typename...Args>
inline void read(T&t,Args&...args){
	read(t);read(args...);
}
const int N = 1e4+10,M = 1e3+10,INF = 0x3f3f3f3f;
int n,m,k;
struct{
	int x,y,vis;
}guan[N],niao[N]; 
int dp[N][M+M],ans=INF;
int main(){
//	double BEGIN = clock();

	read(n,m,k);
	for(int i=1;i<=n;++i) read(niao[i].x,niao[i].y);
	for(int i=1,p;i<=k;++i){
		read(p);read(guan[p].x,guan[p].y);
		guan[p].vis = 1;
	}
	memset(dp,INF,sizeof(dp));
	for(int i=1;i<=m;++i) dp[0][i]=0;
	for(int i=1;i<=n;++i){
		for(int j=niao[i].x+1;j<=niao[i].x+m;++j) dp[i][j] = min(dp[i-1][j-niao[i].x],dp[i][j-niao[i].x])+1;
		for(int j=m+1;j<=niao[i].x+m;++j) dp[i][m] = min(dp[i][m],dp[i][j]);
		for(int j=1;j<=m-niao[i].y;++j) dp[i][j] = min(dp[i][j],dp[i-1][j+niao[i].y]);
		if(guan[i].vis){
			for(int j=1;j<=guan[i].x;++j) dp[i][j]=INF;
			for(int j=guan[i].y;j<=m;++j) dp[i][j]=INF;
		}
	}
	for(int j=1;j<=m;++j) ans = min(ans,dp[n][j]);
	if(ans<INF) printf("1\n%d",ans);
	else{
		ans = 0;
		for(int i=1;i<n;++i){
			if(guan[i].vis){
				int f = 1;
				for(int j=guan[i].x+1;j<guan[i].y;++j){
					if(dp[i][j]!=INF){
						++ans;
						f = 0;
						break;
					}
				}
				if(f) break;
			}
		}
		printf("0\n%d",ans);
	}
	
//	double END = clock();
//	printf("%lf",(END-BEGIN)/CLOCKS_PER_SEC);
	return 0;	
} 

2024/9/8 20:35
加载中...